- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
#include <stdio.h>
int main(void)
{
int d2[3][3][3];
int i,i2,i3;
for(i = 0; i <= 3; ++i)
for(i2 = 0; i2 <= 3; ++i2)
for(i3 = 0; i3 <= 3; ++i3)
d2[i][i2][i3]=5;
i=0,i2=0,i3=0;
for(i = 0; i <= 3; ++i)
for(i2 = 0; i2 <= 3; ++i2)
for(i3 = 0; i3 <= 3; ++i3)
printf("%d\n",d2[i][i2][i3]);
return 0;
}
играюсь я короче с массивом, этот код компилируется,все печатает но в конце Segmentation fault, почему?
gcc -Wall -Wextra -Werror -Wpedantic -ftrapv -fwrapv -fdiagnostics-show-option -std=gnu11 -o "test" "test.c"
> отсутствие фигурных скобок
> инициализация кучи переменных в одну строчку без пробелов
> присвоение куче переменных в одну строчку без пробелов
><
фигурные скобки да, но у меня в блоках по одной строке
да, инициализировать надо было так i=i2=i3=0;
блядь а
повбивав бы
Ваш кэп.
скорее, хвосты
Приду - проверю
Дай я тебя обниму! Хоть кто-то читает предупреждения.
"Компилятор, ну найди мой косяк, ну пожалуйста!"
Кстати, ни splint, ни cppcheck не обнаружили выход за границы.
А ведь это простейший случай, когда все границы и индексы известны во время компиляции... Что уж говорить о более серьезных проблемах.
А вот AddressSanitizer проблему в рантайме зарепортил:
по крайней мере гцц выдает намного больше сообщений при компиляции с оптимизацией чем без нее.
Так ладно влошенность, но он же в самом верхнем цикле выходит за границу.
-Werror -Wall - норма жизни, только так и компиляем.
При приступах паранойи компиляют клангом с -Weverything -Werror.
компилишь - ни одного ворнингра. чекинишь. на след приходят колеги и жалуются что я там за херню вчекинил, ворнинги теперь сыпятся. разница? - компилил в дебаге, они в релизе.
> о поломке стрикт алиасинга в аналоге optional<T>, реализованном через char[sizeof(T)]
Алиасинг между char* и T* допустим стандартом, не пойму, чего он там ругается.
Как написать свой аллокатор без реинтерпрет_каста?
jni/..\..\units\/container.h: In member function 'tblib::Format& tblib::Format::ArgDig(T, int, int, int) [with const char* pat = ((const char*)((char*)(& pat_flt))), T = float]':
П.С. приходится для спринтф хардкодом выделять буфер на 64 знака, ибо снпринтф в студии-2003 нема.
Какая у тебя версия компилятора?
Я бы на твоём месте включил -f-no-strict-overflow
Там есть какая-то похожая функция. sprintf_s() вроде бы.
А вообще - зачем тебе в крестах спринтф?
Я покопался в поиске, и мне сказали, что единственный способ перевести число в строку, понимаемый обоими моими компиляторами, не хуячя ифдефы на каждый чих - это спринтф.
"Ты заработал %i очков, а рекорд %i очков, кстати у тебя осталось %i хитпоинтов, и ты на %i уровне" - на стримах охуеешь.
Во-вторых, от лисапедирования перевода числа в строку это не освобождает.
Я тут СТЛ выкинул из сапёра (который под ведроид), так пакет (с 3 бинарниками!) похудел с 650 до 250 килобайт.
> похудел
а ты предлагаешь
> boost::format
не-не-не
фи, зачем, boost::spirit
но если что, Тарас, в спирите самый быстрый вывод чисел в строку и обратно, задумайся
Ну да, это очень актуально, ибо Тарас тысячи раз в секунду выводит строки в духе "Ты заработал %i очков, а рекорд %i очков, кстати у тебя осталось %i хитпоинтов, и ты на %i уровне"...
Он заинлайнил эти Size() и Resize() примерно до вот такого состояния: После чего вспомнил, что знаковое переполнение это UB, и заметил, что если знакового переполнения не возникнет - условие будет всегда true (а если возникнет, то всем похуй, и пусть тоже будет true). Лечить можно, емнип, двумя способами - загнать под ковёр опцией -fno-strict-overflow, либо юзать беззнаковый размер, у которого UB'а при переполнении нет.
Какая хуя компилятор сначала мне выдаёт предупреждение? Это его работа - инлайнить и находить то, что можно вырезать, и не надо мне про это сообщать.
Я тут ещё ассерт перед ресайзом вхерачил, что типа вот точно будет новый размер больше старого, не, предупреждение никуда не делось.
Ну пиздец, что это за проверки, которые не обойти ваще никак?
У меня всего хватит.
..\units/fixed.h:66: warning: dereferencing pointer '<anonymous>' does break strict-aliasing rules
..\units/fixed.h:66: warning: dereferencing pointer '<anonymous>' does break strict-aliasing rules
..\units/tbarr.h:134: note: initialized from here
ок, попробую заменить на
&buf[0]
jni/..\..\units\/tbdynarr.h:282: warning: dereferencing pointer '<anonymous>' does break strict-aliasing rules
jni/..\..\units\/tbdynarr.h:282: warning: dereferencing pointer '<anonymous>' does break strict-aliasing rules
jni/..\..\units\/tbdynarr.h:282: warning: dereferencing pointer '<anonymous>' does break strict-aliasing rules
jni/..\..\units\/tbarr.h:118: note: initialized from here
Это неисправимо: https://bugzilla.redhat.com/show_bug.cgi?id=531483
Как обновить гцц? Мне нужен именно кросс-компилятор, и чтобы плагин его подхватил нормально.
Кросс-гцц из винды под ARM? Он же из NDK берётся? Хуй знает тогда, я под виндой кросс-гцц никогда не собирал сам...
БЛЯ БЛЯ
БЛЯ БЛЯ БЛЯ
БЛЯ БЛЯ БЛЯ БЛЯ
PS> Правда по сравнению со студией 2003 и селероном вполне новая версия.
> студия 2003
Юзай древнее говно @ ругай кресты.
Юзай свежее говно @ ругай себя.
народная мудрость
GCC 4.4.3: January 21, 2010
5 лет всего, тащемта.
Для сравнения с 2003 студией надо гцц 3.3.х.
Пришлось срочно откатывать всё нахуй.
Вот такое оно всё коричневое с разработкой под ведро.
Там еще какой-то вариант был, когда можно. Но я его не помню, поищи в стандарте.
вот и всё, нет проблем, няяяя
а, уже ответили, точно же
Пробовал задефайнить int, чтобы было вообще ноль символов, но в этом случае либо <cstdio> ломается, либо, если <cstdio> раньше подключать, ломается "int main". Но как задефайнить main, чтобы там был обычный инт, не понял. Разве что, задевайнить уже в теле main, но это не так красиво.
если подключить правильную библиотеку
---
А хотя нет, не поэтому не работает. Так что видимо Си соснул.
Кстати, в связи с этим пришло сейчас в голову:
http://ideone.com/RWJ0hw
http://ideone.com/Edd5UV
P.S. http://ideone.com/diQTJe. Кто меньше?