PVS-Studio corporate blog
Open source
PHP
C
Comments 28
+1
Часть классических ошибок можно избежать просто не используя копипасту, а переписывая код. Ну потратишь ты на две минуты больше, за то избежишь ошибок «V501 There are identical sub-expressions»
+67
Это верно.

Но Вы же скопировали «V501 There are identical sub-expressions», а не набрали заново? :-).
+1
Довольно странно при цитировании не использовать копирование. Задача как раз повторить.
С кодом да, лень берет своё, тут вы правы.
+15
Это сомнительное утверждение. Нет, я не защищаю копипасту, но вероятность того, что при переписывании вы допустите «свою» опечатку или ошибку скорей всего НЕ ниже, чем вероятность ошибки в уже написанном коде.
+1
Вы видимо плохо знакомы с высказываниями статистов, поясню — это равносильное обратное предположение, показывающее сомнительность первоначального утверждения о копипасте (кратко — вероятно и то и другое).
-6
Моё утверждение абсолютно — нет копипасты, нет ошибок, которые тянут за собой недосмотры по копипасте. То, что при этом могут быть ошибки программиста в его логике, которую он пишет — тоже возможно. А могут и не быть.
А высказывания — то такое. Все вокруг высказываются. Но я программист, а не статист, и не занимаюсь вычислением вероятности без каких либо данных.
0
нет копипасты, нет ошибок, которые тянут за собой недосмотры по копипасте


вы заменяете один класс ошибок (ошибки при копипасте) другими (опечатки). По итогу человеческий фактор всеравно берет свое.
+6
Источником некоторых проблемных мест стал фреймворк Zend

Это вроде не фреймворк. Это Zend Engine.

+1
Точно, спасибо.
Ошибкам, правда, везде уютно живётся — и в коде фреймворков, и в коде виртуальных машин. :)
+5
В spl_fixedarray_object_write_dimension ошибки нет — в конце тела условия if (intern->fptr_offset_set) стоит return, так что tmp объявлена в правильном scope, в противном случае могла быть утечка памяти.

UPD: чёрт, я был уверен, что markdown в комментах поддерживается.
0
UPD: чёрт, я был уверен, что markdown в комментах поддерживается.
Поддерживается, если установить галочку под комментарием.
0
Прошу прощения, где именно «под комментарием»?

https://yadi.sk/i/yesu-7MCrRWBa
-3
Упрощение конечно хорошо, но вот в этом примере, где вы предлагаете заменить if (!path || (path && !*path)) на if (!path || !*path)) человеку будет проще понять первое условие, по крайней мере мне.
-6
а не вызовет ли тут чтение по указателю 0 ошибку доступа к странице в упрощённом случае?
0
Да верно, это азы, не подумайте что мы их не знаем :), просто конструкция сбивает с толку с первого взгляда. Тут надо чуть больше подумать, чем в первом варианте, чтобы разобраться как работает. Но может это дело привычки.
+5
Для меня наоборот второй вариант кажется лучше — меньший код необходимо интерпретировать в мозге, чтобы понять логику.
-3
Ждем официальных объяснений ;) С первого взгляда упрощение кажется ошибочным, да и не нужно тут ничего упрощать, компилятору пофиг на все эти упрощения, а человеку во многих случаях понять сложнее будет в итоге.
0
Кстати, скажу слово в защиту макросов: правильное применение макросов позволяет свести к нулю ошибки копипаста и значительно сократить количество кода.

Простейший пример (код на ObjC):

#define __T_STRINGIFY(x) #x
#define DEFINE_CONSTANT_KEY(kConstantKey) static NSString * const kConstantKey = @__T_STRINGIFY(kConstantKey)

DEFINE_CONSTANT_KEY(kLanguagesSelectionKey);

И всё. Вы больше никогда не забудете изменить значение переменной.

Так же есть вещи, которые нельзя вынести в методы, вроде агрегации va_list. Так же неплохо макросы подходят для отладки: например, единственный #define MEASURE_ELAPSED_TIME(code) <...> экономит десятки строк кода на измерении быстродействия.
Only those users with full accounts are able to leave comments., please.