Challenge
Ensure that you are using 32-bit or 64-bit data types as appropriate for your variables. Caution in this area conserves resources and avoids data bloat.
Ensure that you are using 32-bit or 64-bit data types as appropriate for your variables. Caution in this area conserves resources and avoids data bloat.
typedef vector<string> ArrayOfStrings;
bool Find_Incorrect(const ArrayOfStrings &arrStr)
{
Продолжаем цикл рассказов о 64-битных ошибках, обнаруживаемых в реальных приложениях. Время идет, потребности в потребляемой памяти растут и пришел момент, когда кто-то решил отсортировать массив, состоящий более чем из 2^31 элементов. Для этого он решил воспользоваться функцией qsort, реализованной OpenBSD 4.5. Результатом стало обнаружение новой 64-битной ошибки.
В предыдущей записи блога я обещал рассказать, почему сложно демонстрировать 64-битные ошибки на простых примерах. Разговор касался operator[] и я говорил, что в простых случаях может работать даже явно некорректный код. Сейчас я приведу такой пример:
class A
{
public:
virtual int x(unsigned) { return 1; }char *A = "123456789"; unsigned B = 1; char *X = A + B; // X: "23456789" char *Y = A - (-B); // Y: <Bad Ptr>
#include < stdlib.h >
void test()
{
const size_t Gbyte = 1024 * 1024 * 1024;
size_t i;
char *Pointers[3];
// Allocate
for (i = 0; i != 3; ++i)
Pointers[i] = (char *)malloc(Gbyte);
#include < stdlib.h >
void test()
{
const size_t Gbyte = 1024 * 1024 * 1024;
size_t i;
char *Pointers[3];
// Allocate
for (i = 0; i != 3; ++i)
Pointers[i] = (char *)malloc(Gbyte);
// Use