Здравствуйте, Mystic, Вы писали:
C>>Потому, что управляемые языки ИСКЛЮЧАЮТ "ДТП", связанные, с этим (манипуляция указателей) классом ошибки.
M>Будут ошибки, связанные не с манипуляцией указателями, а с манипуляцией индексами. Если код перевести на C#, то ошибка никуда не исчезнет, но сразу проявится при запуске.
Не будет ошибки — трудноуловимого бага, как в С++, будет исключение с сообщением о том, что индекс за пределами диапазона.
Re: Модульные тесты и "безопасные" языки - хорошо.
C>"Прелесть" С++ (кто представляет себе ассемблерный код после компиляции поймет что в таком случае произойдет): C>
C>int i;
C>int array[4];
C>for (int i = 0; i <= 4; i++) {
C> array[i]=0;
C>}
C>
C>(подсказка: бесконечный цикл)
Во-первых, совершенно необязательно. Зависит от компилятора, системы, параметров оптимизации и много чего другого. Например, никто не помешать разложить компилятору цикл в последовательность из четырех операций.
Во-вторых, подобное звучит примерно на столько же убедительно, насколько такое:
C++ — плохой язык, на нем можно написать такое: system("del C:\*.*").
Кстати, человек, действительно знакомый с С++ не по-наслышке, никогда такого, что у тебя в примере не напишет. Мне, например, сразу в глаза бросилось <= — такое условие в цикле итерации не встречается никогда.
Ну и в последних, писать итеративные циклы в С++, где есть for_each, bind и lambda — каменный век.
Да здравствует мыло душистое и веревка пушистая.
Re[2]: Модульные тесты и "безопасные" языки - хорошо.
Здравствуйте, Vamp, Вы писали:
C>>"Прелесть" С++ (кто представляет себе ассемблерный код после компиляции поймет что в таком случае произойдет): C>>
C>>int i;
C>>int array[4];
C>>for (int i = 0; i <= 4; i++) {
C>> array[i]=0;
C>>}
C>>
C>>(подсказка: бесконечный цикл) V>Во-первых, совершенно необязательно. Зависит от компилятора, системы, параметров оптимизации и много чего другого. Например, никто не помешать разложить компилятору цикл в последовательность из четырех операций. V>Во-вторых, подобное звучит примерно на столько же убедительно, насколько такое:
V>
V>C++ — плохой язык, на нем можно написать такое: system("del C:\*.*").
V>Кстати, человек, действительно знакомый с С++ не по-наслышке, никогда такого, что у тебя в примере не напишет.
Напишет.
void myFoo(int *arr, int length)
{
for (int i = 0; i < length; i++) {
arr[i] = 0;
}
}
...
int *arr = new int[length];
...
length++;
...
myFoo(arr, length);
V>Мне, например, сразу в глаза бросилось <= — такое условие в цикле итерации не встречается никогда.
В VISA тоже так думали.
V>Ну и в последних, писать итеративные циклы в С++, где есть for_each, bind и lambda — каменный век.
В std есть lambda? С каких пор?
Re[3]: Модульные тесты и "безопасные" языки - хорошо.
Здравствуйте, Pzz, Вы писали:
Pzz>Здравствуйте, criosray, Вы писали:
C>>У кого еще остались сомнения в целесообразности модульных тестов, в целесообразности использования языков/платформ с большим количеством статических и динамических проверок...
Pzz>Я где-то читал, что повсеместное введение автомобильных ремней безопасности не снизило количество смертей на дорогах: люди почувствовали себя "безопаснее" и стали ездить быстрее.
Ой, а можно с контр-аналогией встряну? Спасибо.
Когда в ПДД, водителей мотоциклов обязали едить в шлеме, травматизм в стране резко вырос. Стали разбираться че за фигня. И вопреки очевидному мнению, что люди стали ездить небрежнее, чувствуя себя в большей защищенности, выяснилась несколько другая вещь. Травматизм действительно вырос, т.к. раньше люди тупо убивались насмерть и портили статистику моргам, а не отделениям травматологии.
Здравствуйте, criosray, Вы писали:
C>http://habrahabr.ru/blogs/lifehack/64627/
C>"Прелесть" С++ (кто представляет себе ассемблерный код после компиляции поймет что в таком случае произойдет): C>
C>int i;
C>int array[4];
C>for (int i = 0; i <= 4; i++) {
C> array[i]=0;
C>}
C>
C>(подсказка: бесконечный цикл)
садитесь, два.
Если бы Вы знали, как работает стэк, то поняли бы, что запись в array[4] затрет внешнюю (по отношению к циклу) переменную i, и никаким образом на количестве итераций не скажется.
Re[2]: Модульные тесты и "безопасные" языки - хорошо.
C>>int i;
C>>int array[4];
C>>for (int i = 0; i <= 4; i++) {
C>> array[i]=0;
C>>}
C>>
C>>(подсказка: бесконечный цикл) M_>садитесь, два. M_>Если бы Вы знали, как работает стэк, то поняли бы, что запись в array[4] затрет внешнюю (по отношению к циклу) переменную i, и никаким образом на количестве итераций не скажется.
Опечатка конечно подразумевалось for (i = 0;
Если Вам нравится цепляться к словам, то и я прицеплюсь к Вашим: в языке С конструкция for (int i;... синтаксически некорректна.
Садитесь, два.
Re[4]: Модульные тесты и "безопасные" языки - хорошо.
C>>void myFoo(int *arr, int length)
C>>{
C>> for (int i = 0; i < length; i++) {
C>> arr[i] = 0;
C>> }
C>>}
C>> const int length = 4;
C>>int *arr = new int[length];
C>>...
C>>length++;
C>>...
C>>myFoo(arr, length);
C>>
C>>В std есть lambda? С каких пор? V>В tr есть. А еще есть буст.
Ни то, ни другое пока не стандарт, а следовательно пременимо далеко не везде. Не говоря уж о МАССЕ legacy кода.
Re[4]: Модульные тесты и "безопасные" языки - хорошо.
C>>>"Прелесть" С++ (кто представляет себе ассемблерный код после компиляции поймет что в таком случае произойдет): C>>>
C>>>int i;
C>>>int array[4];
C>>>for (int i = 0; i <= 4; i++) {
C>>> array[i]=0;
C>>>}
C>>>
C>Опечатка конечно подразумевалось for (i = 0; C>Если Вам нравится цепляться к словам, то и я прицеплюсь к Вашим: в языке С конструкция for (int i;... синтаксически некорректна.
А причем тут С? В начале речь шла о С++. В С++ это более чем корректная конструкция.
Да здравствует мыло душистое и веревка пушистая.
Re[5]: Модульные тесты и "безопасные" языки - хорошо.
C>ccode] C>>>void myFoo(int *arr, int length) C>>>{ C>>> for (int i = 0; i < length; i++) { C>>> arr[i] = 0; C>>> } C>>>} C>const int length = 4; C>>>int length; std::cin >> length; C>>>int *arr = new int[length]; C>>>... C>>>length++; C>>>... C>>>myFoo(arr, length); C>>>[/ccode]
C>Давайте без самодеятельности, ок? length должно быть получено в рантайм (пользовательский ввод, или на основе какой-то логики).
Тогда это пишется так:
void myFoo(std::vector<int> &vec)
{
for (std::vector<int>::const_iterator it = vec.begin(), end = vec.end(); it != end; it++) {
*it = 0;
}
}
std::vector<int> arr(length);
myFoo(arr);
Хотя, как я уже сказал, разумный человек использует лямбду.
Да здравствует мыло душистое и веревка пушистая.
Re: Модульные тесты и "безопасные" языки - хорошо.
C>У кого еще остались сомнения в целесообразности модульных тестов, в целесообразности использования языков/платформ с большим количеством статических и динамических проверок...
C>http://habrahabr.ru/blogs/lifehack/64627/
C>"Прелесть" С++ (кто представляет себе ассемблерный код после компиляции поймет что в таком случае произойдет): C>
C>int i;
C>int array[4];
C>for (int i = 0; i <= 4; i++) {
C> array[i]=0;
C>}
C>
C>(подсказка: бесконечный цикл)
Неверно. UB. Вполне возможно, что просто ничего не будет.
/* temp.cpp */void func()
{
int i;
int array[4];
for (int i = 0; i <= 4; i++) {
array[i]=0;
}
}
; Listing generated by Microsoft (R) Optimizing Compiler Version 15.00.21022.08
TITLE d:\2009\MagiC_1_00\CCore\test\temp.cpp
.686P
.XMM
include listing.inc
.model flat
INCLUDELIB LIBCMT
PUBLIC ?func@@YAXXZ ; func
; Function compile flags: /Ogtpy
; File d:\2009\magic_1_00\ccore\test\temp.cpp
; COMDAT ?func@@YAXXZ
_TEXT SEGMENT
?func@@YAXXZ PROC ; func, COMDAT
; 5 : int i;
; 6 :
; 7 : int array[4];
; 8 : for (int i = 0; i <= 4; i++) {
; 9 : array[i]=0;
; 10 : }
; 11 : }
ret 0
?func@@YAXXZ ENDP ; func
_TEXT ENDS
END
Здравствуйте, criosray, Вы писали:
C>Не будет ошибки — трудноуловимого бага, как в С++, будет исключение с сообщением о том, что индекс за пределами диапазона.
Вот приятно получить от банкомата исключение с сообщением в тот момент, когда бапки со счета он уже списал, за щеку себе отслюнил, а в руки вам еще не выдал.
Re[6]: Модульные тесты и "безопасные" языки - хорошо.
Здравствуйте, Vamp, Вы писали:
C>>ccode] C>>>>void myFoo(int *arr, int length) C>>>>{ C>>>> for (int i = 0; i < length; i++) { C>>>> arr[i] = 0; C>>>> } C>>>>} C>>const int length = 4; C>>>>int length; std::cin >> length; C>>>>int *arr = new int[length]; C>>>>... C>>>>length++; C>>>>... C>>>>myFoo(arr, length); C>>>>[/ccode]
C>>Давайте без самодеятельности, ок? length должно быть получено в рантайм (пользовательский ввод, или на основе какой-то логики). V>Тогда это пишется так:
V>
V>void myFoo(std::vector<int> &vec)
V>{
V> for (std::vector<int>::const_iterator it = vec.begin(), end = vec.end(); it != end; it++) {
V> *it = 0;
V> }
V>}
V>std::vector<int> arr(length);
V>myFoo(arr);
V>
Код неверный. std::vector<int>::const_iterator
Лучше так
int array[444];
Range(array).set_null();
V>Хотя, как я уже сказал, разумный человек использует лямбду.
Здравствуйте, Pzz, Вы писали:
Pzz>Здравствуйте, criosray, Вы писали:
C>>Не будет ошибки — трудноуловимого бага, как в С++, будет исключение с сообщением о том, что индекс за пределами диапазона.
Pzz>Вот приятно получить от банкомата исключение с сообщением в тот момент, когда бапки со счета он уже списал, за щеку себе отслюнил, а в руки вам еще не выдал.
Смешно. Для этого существуют транзакции.
Re[3]: Модульные тесты и "безопасные" языки - хорошо.
Здравствуйте, kochetkov.vladimir, Вы писали:
KV>Здравствуйте, Pzz, Вы писали:
Pzz>>Здравствуйте, criosray, Вы писали:
C>>>У кого еще остались сомнения в целесообразности модульных тестов, в целесообразности использования языков/платформ с большим количеством статических и динамических проверок...
Pzz>>Я где-то читал, что повсеместное введение автомобильных ремней безопасности не снизило количество смертей на дорогах: люди почувствовали себя "безопаснее" и стали ездить быстрее.
KV>Ой, а можно с контр-аналогией встряну? Спасибо.
KV>Когда в ПДД, водителей мотоциклов обязали едить в шлеме, травматизм в стране резко вырос. Стали разбираться че за фигня. И вопреки очевидному мнению, что люди стали ездить небрежнее, чувствуя себя в большей защищенности, выяснилась несколько другая вещь. Травматизм действительно вырос, т.к. раньше люди тупо убивались насмерть и портили статистику моргам, а не отделениям травматологии.
KV>"Так-то" (с)
одно не ясно — почему они все вместе не портили статистику ментам, как пострадавшие в аварии?
Re[4]: Модульные тесты и "безопасные" языки - хорошо.
Здравствуйте, swined, Вы писали:
S>одно не ясно — почему они все вместе не портили статистику ментам, как пострадавшие в аварии?
Портили. Именно поэтому, у меня и моих коллег, после распространения управляемых сред, работы меньше не стало. Просто уязвимости стали другие, однако большая их часть, стала нести с собой гораздо меньше рисков
Здравствуйте, criosray, Вы писали:
C>"Прелесть" С++ (кто представляет себе ассемблерный код после компиляции поймет что в таком случае произойдет): C>
C>int i;
C>int array[4];
C>for (int i = 0; i <= 4; i++) {
C> array[i]=0;
C>}
C>
Если уж быть совсем точным, то это "прелесть" C. А в C++ есть std::vector который не позволяет выходить за границу массива.
P.S. Ты еще приведи ассемблерные вставки и рассажи как легко в С++ можно испортить стек\регистры...
UNIX way — это когда тебе вместо туалетной бумаги дают топор, рубанок и карту близлежащего леса
Re[2]: Модульные тесты и "безопасные" языки - хорошо.
Здравствуйте, Pzz, Вы писали:
C>>У кого еще остались сомнения в целесообразности модульных тестов, в целесообразности использования языков/платформ с большим количеством статических и динамических проверок...
Pzz>Я где-то читал, что повсеместное введение автомобильных ремней безопасности не снизило количество смертей на дорогах: люди почувствовали себя "безопаснее" и стали ездить быстрее.
Т.е. повысив скорость смертность не увеличили.
Pzz>Внедрение безопасных методик и инструментов может повысить продуктивность и качество каждого из нас, уже сложившихся программистов, но не увеличит качество индустрии в целом. Продуктивность может и увеличит, за счет снижения требований к квалификации работников.
Т.е. увеличив количество решаемых задач/уменьшив время на разработку/уменьшив стоимость разработки надёжность не уменьшится.