принудительно компилировать gcc при обнаружении переполнения стека - PullRequest
1 голос
/ 14 декабря 2010

Как я могу заставить gcc скомпилировать программу, в которой я объявляю массив целых чисел без знака, который больше моего барана - без предупреждения с предупреждением: "переполнение целого числа в выражении"?

например.У меня есть 8 ГБ оперативной памяти, и я хочу объявить массив 8,5 ГБ.

edit:

спасибо всем, я понял, что проблема была не в типе данных, а в некоторых препроцессорах.это заняло у меня довольно много времени.:) я написал

#define GIBI 1073741824
#define ARRAYSIZE 2*GIBI

и, очевидно, компилятору это не понравилось.

Ответы [ 4 ]

5 голосов
/ 14 декабря 2010

Это сообщение об ошибке не говорит о том, что у вас закончится стек, хотя вы это сделаете.Это говорит о том, что число слишком велико, чтобы представлять его в size_t.Убедитесь, что вы компилируете для 64-битной цели.

Более того, не делайте этого.Если вам нужно выделить гигантские объемы оперативной памяти, делайте это с malloc, а не со стеком.Или, еще лучше, с mmap.

5 голосов
/ 14 декабря 2010

integer overflow in expression не является переполнением стека, это означает, что GCC обнаружил, что результат вашего выражения вызывает целочисленное переполнение в lvalue, которому вы его назначаете.Например, если вы попытаетесь malloc что-то вроде INT_MAX * 2, это выражение вызовет целочисленное переполнение.Если вы приведете его к size_t, вы должны быть без предупреждения:

void *myvar = malloc((size_t) INT_MAX * 2);

size_t, конечно, зависит от платформы, и вы могли бы также переполнить, чтоесли вы не можете представить размер блока, который вы хотите выделить в sizeof(size_t) битах.По сути, убедитесь, что вы используете тип, способный представлять объем памяти, который вы хотите выделить, и что он совместим с size_t (поскольку это то, чего ожидает malloc(), согласно stdlib.h).

0 голосов
/ 14 декабря 2010

Если вам нужно выделить больше памяти, чем у вас есть ОЗУ, вы можете изучить файлы с отображением в памяти. Таким образом, вам не нужно беспокоиться о физической памяти на вашей машине (из-за которой у вас нет доступа ко всем 8 ГБ в любом случае)

http://msdn.microsoft.com/en-us/library/dd997372.aspx

0 голосов
/ 14 декабря 2010

Я вполне уверен, что "integer overflow in expression"? означает , а не означает, что вы переполняете стек, а скорее выполняете некоторую математику, которая потенциально может переполнить целое число со знаком, равное Неопределенное поведение . Будет полезно, если вы вставите строку, на которую ссылается предупреждение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...