Странная логика gcc ++
Отлаживал тут коечто на стыке Ц и плюсов ну и соответственно чтото принимает const char* чтото std::string, возвращает тоже в разнобой...(код местами оч старый а местами и вообще чужой)
if( strcmp_i(value, val) == 0 ){
printf("Exact found %s=%s [%d]\n", opt->getKey(), val, i);
_selectedindex = i;
return true;
}
при выполнении бросает SIGILL (4) Ilegal Instruction, все падает в корку и из корки видно что ошибка находится
> if( strcmp_i(value, val) == 0 )
стэк не поврежден, все параметры валидные.... через минут 15 вскипания бинарник был запущен под IDA и выяснилось что ошибка в printf в который передается по значению экземпляр std::string (opt->getKey() возвращает std::string&)
Как я понял дело в том что в случае если в функции типа printf с переменным числом параметров, передаются не POD - то вместо вызова этой функции компилятор (g++4.x) заботливо генерирует asm ud2 (undefined instruction) что собственно и приводит к SIGILL.
Под MSVC все нормально - принтф выводт полную ерунду но ничего не падает.
Непонятна логика gcc шников, очевидно что компилятор на этапе трансляции уже знает об ошибке, но вместо того чтобы выдать ошибку компиляции зачемто раскладывает такие грабли. Зачем ?
if( strcmp_i(value, val) == 0 ){
printf("Exact found %s=%s [%d]\n", opt->getKey(), val, i);
_selectedindex = i;
return true;
}
при выполнении бросает SIGILL (4) Ilegal Instruction, все падает в корку и из корки видно что ошибка находится
> if( strcmp_i(value, val) == 0 )
стэк не поврежден, все параметры валидные.... через минут 15 вскипания бинарник был запущен под IDA и выяснилось что ошибка в printf в который передается по значению экземпляр std::string (opt->getKey() возвращает std::string&)
Как я понял дело в том что в случае если в функции типа printf с переменным числом параметров, передаются не POD - то вместо вызова этой функции компилятор (g++4.x) заботливо генерирует asm ud2 (undefined instruction) что собственно и приводит к SIGILL.
Под MSVC все нормально - принтф выводт полную ерунду но ничего не падает.
Непонятна логика gcc шников, очевидно что компилятор на этапе трансляции уже знает об ошибке, но вместо того чтобы выдать ошибку компиляции зачемто раскладывает такие грабли. Зачем ?
