atoi crashes the application

uniqueman
Уже с Приветом
Posts: 2013
Joined: 16 Mar 2002 10:01
Location: New York City

atoi crashes the application

Post by uniqueman »

Ничего не понимаю.. есть такие строчки

CString m_sT1Boards = "2";
int Boards = atoi (m_sT1Boards);

на второй строчке приложение крашится напрочь и просто вылетает. Никаких ошибок не выдает.. как только я вместо 2 ставлю 0 допустим, то все нормально :pain1:

Апликация запускается на NT. На всех других работает нормально
Sanych
Уже с Приветом
Posts: 7728
Joined: 10 Jan 1999 10:01
Location: OH->TX->MI->MA->VA->FL->...

Post by Sanych »

uniqueman, наблюдая Вашу активность здесь, разрешите Вас спросить, Вы когда нибудь пользовались Google Groups http://www.google.com/grphp в поисках ответов на Ваши вопросы?
Мне кажется что это было бы гораздо эффективней, да и встретили бы массу интересного для себя.

Для начала Вы бы обратили внимание на определение функции atoi()? Это функция из стандартного C, и ее аргумент ессно не может быть MFC объектом (С++)!

Ну а дальше - GOOGLE RULEZZZZZZ! :mrgreen: :

http://groups.google.com/groups?hl=ru&l ... .com#link1

http://groups.google.com/groups?hl=ru&l ... .net#link1
uniqueman
Уже с Приветом
Posts: 2013
Joined: 16 Mar 2002 10:01
Location: New York City

Post by uniqueman »

Sanych,

При всем уважении, don't be a smart ass, OK? Неужели Вы думаете, что я по каждому вопросу буду бегать в Привет. Я перепробовал все параметры которые только можно..

из Вашего же примера..

char *str = "9";
int x = atoi(str); // говорят будет работать

В моем примере,

const char* sTemp = "9";
int i = atoi (sTemp);

приводит к крашу..
User avatar
KVA
Уже с Приветом
Posts: 5347
Joined: 03 Feb 1999 10:01
Location: NJ, USA

Post by KVA »

uniqueman wrote:В моем примере,

const char* sTemp = "9";
int i = atoi (sTemp);

приводит к крашу..


Даже если создать новый совершенно пустой проект?

То что изначальный пример вылетает только в NT наводит на мысли что это может быть как-то связано с unicode. А скорее этот краш никак не связан с atoi и CString. Кто-то в совершенно другом месте трет память/стек и т.д. и т.п.
Sanych
Уже с Приветом
Posts: 7728
Joined: 10 Jan 1999 10:01
Location: OH->TX->MI->MA->VA->FL->...

Post by Sanych »

> При всем уважении, don't be a smart ass, OK? Неужели Вы
> думаете, что я по каждому вопросу буду бегать в
> Привет.

Однако у меня возникло такое впечатление, несмотря на то что дело дошло до задниц...

> Я перепробовал все параметры которые только
> можно..

По моему подход неверен. Попробуйте сделать то же самое в пустом проекте, как упоминал KVA

> из Вашего же примера..

Моего??? :roll: :roll: :roll:
Я вроде не приводил ни единого примера :pain1:

> char *str = "9";
> int x = atoi(str); // говорят будет работать

uniqueman, "будет работать" - понятие условное. Если смешать пополам бензин с соляркой, то некоторые карбюраторные автомобили тоже могут работать, хотя чад будет еще тот :wink:

Если вовсю баловаться кастингом, не вникая в детали, то то и стандартные функции могут не работать. Часто первые признаки - Debug версия работает, а Release - падает.
Наиболее часто такие вещи происходят, когда переменные "наезжают" друг на друга.
У нас ребята 3 месяца ловили проблему с крушением DLL'a в Release, когда в Debug все вроде работало (если пробовать меньше 5-ти раз :mrgreen: ) А проблема оказалась в том, что в DLL функцию объявили как

int WINAPI func(void *);

а потом пользовали указатель как на:

int WINAPI func(void);

В результате возникал "перекос" стека.

Или, скажем, популярная проблема, объявили
char str[4];
int i;


а потом загоняете в str что нить типа строки "stop" длиной в 4 символа. и инициализируете
i = 25;

Если компилятор последовательно распределит память под str а потом под i, то строка "stop" частично "наедет" на переменную i. Ну а когда Вы проинициализируете i, то, по сути дела, убьете '\0' на конце строки "stop". Ну и ессно потом любая строковая операция с str вызовет непредсказуемые результаты.

Это наиболее типичные примеры возникновения подобных проблем. Действительность может быть намного хуже :pain1:


> В моем примере,
> const char* sTemp = "9";
> int i = atoi (sTemp);
> приводит к крашу.

А попробуйте поставить для прикола пару буферов вокруг, типа:

const char buf1[512] = {'\0'};
const char* sTemp = "9";
const char buf2[512] = {'\0'};
int i = atoi (sTemp);


Если крэша не будет, то очень похоже на "наезд" переменных или перекос стека.
uniqueman
Уже с Приветом
Posts: 2013
Joined: 16 Mar 2002 10:01
Location: New York City

Post by uniqueman »

заметил вот еще что..
Если пишу

const char* a = "0";
int i = atoi (a);

то без проблем, но если вместо нуля вставить любое другое число - crash :pain1:

Никаких переменных рядом с ней не инициализирую. Повторил то же самое на 2000 системе. Ужасно не нравится когда простые до боли функции перестают работать на голом месте. Еще как назло в дебаге не могу запустить софт :х
SlaMin
Уже с Приветом
Posts: 176
Joined: 21 Feb 2002 10:01
Location: KZ -> KY -> WA

Post by SlaMin »

uniqueman, проверьте, не линкуетесь ли вы с однопоточной CRT в многопоточном приложении.
uniqueman
Уже с Приветом
Posts: 2013
Joined: 16 Mar 2002 10:01
Location: New York City

Post by uniqueman »

приложеине действительно многопоточное, но в другом месте программы та же функция работает нормально. но все равно гляну на всякий случай, спасибо
User avatar
A. Fig Lee
Уже с Приветом
Posts: 12072
Joined: 17 Nov 2002 03:41
Location: английская колония

Post by A. Fig Lee »

ну atoi то safe, а вот strtok - случайно не используется?
Верить нельзя никому - даже себе. Мне - можно!
User avatar
Pink Panther
Уже с Приветом
Posts: 3811
Joined: 14 Oct 2001 09:01

Post by Pink Panther »

Выглядит так, как будто стэк отвалился. :) Проверьте включена ли опция компилятора /GZ или нет. Эта опция была введена начиная с VC++ 6.0 и в новых проектах включена по умолчанию. Если используется сконвертированный вариант старого проекта, например от VC++ 5.0, то этой опции в settings естественно не будет, если только самому не поставить. При включенной /GZ можно легко найти функцию, которая портит стек, и дальше уже смотреть, в чем же дело.

Return to “Вопросы и новости IT”