Question

I cannot for the life of me figure out what's going on. Here's the error I get:

alloc static vecs
a.out: malloc.c:2451: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed. Aborted (core dumped)

The error occurs in the function Halton in class qmc, which I've included the relevant bits to below. As you can see, the first print statement "alloc static vecs" executes, but the statement std::vector<double> H(s); appears not to, since the print statement immediately following it does not execute.

Now, I should mention that when I replace the statement static std::vector<int> bases = FirstPrimes(s); in Halton with static std::vector<int> bases = {2,3,5,7,11,13}; (the RHS is the return array of FirstPrimes(), just hardcoded) then there is no error.

There are more functions in Halton (it returns a std::vector) but I've omitted them for brevity. I'll add them if anyone wants to try to run it themselves, just ask!

I'm using g++ 4.6 and Ubuntu 12.04, and the compilation command is g++ -std=c++0x scratch.cpp QMC.cpp.

main (scratch.cpp):

#include <iostream>
#include <vector>
#include "QMC.h"

int main() {
  QMC qmc;

  std::vector<double> halton = qmc.Halton(6,1);
}

QMC.h:

#ifndef QMC_H
#define QMC_H

#include <iostream>
#include <cmath>                                 
#include <vector>

class QMC {
 public:
  QMC();
  bool isPrime(int n);
  std::vector<int> ChangeBase(int n, int radix);
  std::vector<int> NextChangeBase(std::vector<int>& a_in, int radix);
  double RadicalInverse(std::vector<int>& a, int b);
  std::vector<int> FirstPrimes(int n);
  std::vector<double> Halton(int s, int n = 0);
};
#endif

QMC.cpp:

#include "QMC.h"

QMC::QMC(){}

std::vector<double> QMC::Halton(int s, int n) {
  static std::vector<std::vector<int> > newBases(s);
  static std::vector<int> bases = FirstPrimes(s);

  /* replacing the statement immediately above with 
     static std::vector<int> bases = {2,3,5,7,11,13}; fixes it */

  std::cout << "alloc static vecs \n";

  std::vector<double> H(s);

  std::cout << "alloc H \n";

  // ...there's more to this function, but the error occurs just above this.
}

std::vector<int> QMC::FirstPrimes(int n) {

  std::vector<int> primes(n);
  primes[0] = 2;

  int testNum = 3;

  for (int countOfPrimes = 1; countOfPrimes <= n; ++countOfPrimes) {
    while (isPrime(testNum) == false)
      testNum = testNum + 2;

    primes[countOfPrimes] = testNum;
    testNum = testNum + 2;
   }

  return primes;
}

bool QMC::isPrime(int n) {
  if (n == 1) return false;  // 1 is not prime                                                                                                   
  else if (n < 4) return true;  // 2 & 3 are prime                                                                                               
  else if (n % 2 == 0) return false; // even numbers are not prime                                                                               
  else if (n < 9) return true; // 5 & 7 are prime                                                                                                
  else if (n % 3 == 0) return false;  // multiples of 3 (> 3) are not prime                                                                      
  else
    {
      int r = floor(sqrt((double)n));
      int f = 5;

      while (f <= r)
        {
          if (n % f == 0) return false;
          if (n % (f + 2) == 0) return false;
          f += 6;
        }

      return true;
    }
}
Was it helpful?

Solution

FirstPrimes has a buffer overflow. The relevant lines:

std::vector<int> primes(n);
primes[0] = 2;

for (int countOfPrimes = 1; countOfPrimes <= n; ++countOfPrimes)
   primes[countOfPrimes] = testNum;

For a vector of size n, the valud indices are 0 through n-1. On the last loop iteration you do an out-of-bounds access.

I'd suggest changing both of the [ ] to .at( ), as well as fixing the logic error. This would also prevent trouble if you happened to call this function with n == 0.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top