]> www.ginac.de Git - ginac.git/blobdiff - ginac/mul.cpp
mul: algebraic_subs_mul(), has(): don't write beyond the end of array
[ginac.git] / ginac / mul.cpp
index dfda4100648a4eadb91c50a403d4cb391f674901..3733bc4ac88115c3b8ffbb45a16265eee4f3615f 100644 (file)
@@ -729,6 +729,9 @@ bool algebraic_match_mul_with_mul(const mul &e, const ex &pat, exmap& repls,
                int factor, int &nummatches, const std::vector<bool> &subsed,
                std::vector<bool> &matched)
 {
                int factor, int &nummatches, const std::vector<bool> &subsed,
                std::vector<bool> &matched)
 {
+       GINAC_ASSERT(subsed.size() == e.nops());
+       GINAC_ASSERT(matched.size() == e.nops());
+
        if (factor == (int)pat.nops())
                return true;
 
        if (factor == (int)pat.nops())
                return true;
 
@@ -760,8 +763,8 @@ bool mul::has(const ex & pattern, unsigned options) const
        if(is_a<mul>(pattern)) {
                exmap repls;
                int nummatches = std::numeric_limits<int>::max();
        if(is_a<mul>(pattern)) {
                exmap repls;
                int nummatches = std::numeric_limits<int>::max();
-               std::vector<bool> subsed(seq.size(), false);
-               std::vector<bool> matched(seq.size(), false);
+               std::vector<bool> subsed(nops(), false);
+               std::vector<bool> matched(nops(), false);
                if(algebraic_match_mul_with_mul(*this, pattern, repls, 0, nummatches,
                                subsed, matched))
                        return true;
                if(algebraic_match_mul_with_mul(*this, pattern, repls, 0, nummatches,
                                subsed, matched))
                        return true;
@@ -771,8 +774,7 @@ bool mul::has(const ex & pattern, unsigned options) const
 
 ex mul::algebraic_subs_mul(const exmap & m, unsigned options) const
 {      
 
 ex mul::algebraic_subs_mul(const exmap & m, unsigned options) const
 {      
-       std::vector<bool> subsed(seq.size(), false);
-       exvector subsresult(seq.size());
+       std::vector<bool> subsed(nops(), false);
        ex divide_by = 1;
        ex multiply_by = 1;
 
        ex divide_by = 1;
        ex multiply_by = 1;
 
@@ -781,7 +783,7 @@ ex mul::algebraic_subs_mul(const exmap & m, unsigned options) const
                if (is_exactly_a<mul>(it->first)) {
 retry1:
                        int nummatches = std::numeric_limits<int>::max();
                if (is_exactly_a<mul>(it->first)) {
 retry1:
                        int nummatches = std::numeric_limits<int>::max();
-                       std::vector<bool> currsubsed(seq.size(), false);
+                       std::vector<bool> currsubsed(nops(), false);
                        exmap repls;
                        
                        if(!algebraic_match_mul_with_mul(*this, it->first, repls, 0, nummatches, subsed, currsubsed))
                        exmap repls;
                        
                        if(!algebraic_match_mul_with_mul(*this, it->first, repls, 0, nummatches, subsed, currsubsed))