The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Продемонстрирован код, который по мнению SCO был скопирован ..., opennews (ok), 12-Июл-10, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


6. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +9 +/
Сообщение от filosofem (ok), 12-Июл-10, 11:40 
ГЫ!! Копирайт на название функции char *strcpy(). Еще бы за использование "int main()" роялити потребовали и "int i;" запатентовали.
Интересно почему у них к Мелкософту нет аналогичных притензий? Там такие же функции.
Ответить | Правка | Наверх | Cообщить модератору

8. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от Feadotemail (ok), 12-Июл-10, 11:46 
интересно, а сколько будет "int i;" в ядре линуха...

pS: насколько помню, самые частые переменные I,J,K,A,B,C...

Ответить | Правка | Наверх | Cообщить модератору

18. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +1 +/
Сообщение от filosofem (ok), 12-Июл-10, 12:06 
>интересно, а сколько будет "int i;" в ядре линуха...

13990

Ответить | Правка | Наверх | Cообщить модератору

21. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от spanasikemail (ok), 12-Июл-10, 12:08 
>13990

Именно int i; ?


Ответить | Правка | Наверх | Cообщить модератору

23. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от filosofem (ok), 12-Июл-10, 12:14 
Именно. В основном в драйверах и фирмварях.
Ответить | Правка | Наверх | Cообщить модератору

24. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от spanasikemail (ok), 12-Июл-10, 12:16 
Плохо. Переменные обнулять нужно при объявлении, если им сразу не присваивается какое-то значение. Я думал, уж ядерщики это точно знают.


Ответить | Правка | Наверх | Cообщить модератору

25. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от filosofem (ok), 12-Июл-10, 12:18 
Ну это не сложно пропатчить при желании. =)
Ответить | Правка | Наверх | Cообщить модератору

27. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от spanasikemail (ok), 12-Июл-10, 12:21 
Это - несложно, а сколько там ещё таких объявлений. Нужно более интенсивно пользоваться инструментами анализа кода для кода, включаемого в ядро, я так считаю.
Ответить | Правка | Наверх | Cообщить модератору

41. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от starik (??), 12-Июл-10, 13:01 
Зачем? Какой  смысл в лишних инструкциях для обнуления? Просто нужно и всё?
Ответить | Правка | К родителю #24 | Наверх | Cообщить модератору

52. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +2 +/
Сообщение от QuAzI (??), 12-Июл-10, 13:48 
Смысл в предсказуемости поведения кода, если дальше где-то что-то пойдёт не так. Вообще, ИМХО, чтобы исключить криворукость, это должен компилятор контролировать. Мол если гарантированно переменная дальше инициализируется, то можно и не обнулять, а если есть варианты, то обнулять однозначно.
Ответить | Правка | Наверх | Cообщить модератору

59. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +3 +/
Сообщение от pazkeemail (?), 12-Июл-10, 14:11 
> Вообще, ИМХО, чтобы исключить криворукость, это должен компилятор контролировать.

gcc это замечательно контролирует и выдает варнинги при использовании неинициализированной переменной. Потому за безмозглое обнуление локальных переменных надо руки вырывать с корнем, потому как в таком случае компилятор ничем не может помочь в поиске логических ошибок в коде.

Ответить | Правка | Наверх | Cообщить модератору

69. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +3 +/
Сообщение от Kibabemail (ok), 12-Июл-10, 14:46 
int i;
for(i=0; i<N; i++) {
...
}
Ответить | Правка | К родителю #24 | Наверх | Cообщить модератору

105. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +1 +/
Сообщение от СуперАноним (?), 12-Июл-10, 18:47 
Пора бы уже им на C99 переползать.
Ответить | Правка | Наверх | Cообщить модератору

111. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +1 +/
Сообщение от User294 (ok), 12-Июл-10, 20:09 
>int i;

Все, сейчас SCO вас засудит за кражу их кода.

Ответить | Правка | К родителю #69 | Наверх | Cообщить модератору

127. "Продемонстрирован код, который по мнению SCO был скопирован ..."  –4 +/
Сообщение от iZEN (ok), 12-Июл-10, 22:43 
>>int i;
>
>Все, сейчас SCO вас засудит за кражу их кода.

Меняй язык программирования Це на Яву — не засудит. ;)

Ответить | Правка | Наверх | Cообщить модератору

155. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +1 +/
Сообщение от User294 (ok), 13-Июл-10, 20:29 
Там засудят за какойнить i++. Невелика разница.
Ответить | Правка | Наверх | Cообщить модератору

157. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от Карбофос (ok), 13-Июл-10, 23:44 
вообще-то протензии scoтов по ядру. перепишите ядро на яве (ненаучная фантастика), тогда уж поболтаем на эту тему. ;)
Ответить | Правка | К родителю #127 | Наверх | Cообщить модератору

161. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от Карбофос (ok), 14-Июл-10, 02:07 
претензии. извиняюсь
Ответить | Правка | Наверх | Cообщить модератору

76. "Продемонстрирован код, который по мнению SCO был скопирован ..."  –1 +/
Сообщение от pavlinux (ok), 12-Июл-10, 15:56 
Знают.
А вы знаете, что инициализированная переменная занимает место в сегменте данных, а не кода?
По-русски - если инитить все переменные до использования ядро будет весить 32Mb
Ответить | Правка | К родителю #24 | Наверх | Cообщить модератору

77. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +1 +/
Сообщение от spanasikemail (ok), 12-Июл-10, 16:00 
про это не думал.

Ответить | Правка | Наверх | Cообщить модератору

82. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от raorn (?), 12-Июл-10, 16:13 
>А вы знаете, что инициализированная переменная занимает место в сегменте данных, а
>не кода?

Перестаньте пороть чушь.  В сегменте кода (.text) переменным не место.  А переменные инициализированные нулём всё равно попадают в .bss.

Ответить | Правка | К родителю #76 | Наверх | Cообщить модератору

83. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +1 +/
Сообщение от Sw00p aka Jeromemail (?), 12-Июл-10, 16:21 
+1 в .bss

пс: незнаю как поступит компилятор если переменная прописанна и не будет изменяться вообще
ну типа в место константы - обычная переменная

Ответить | Правка | Наверх | Cообщить модератору

119. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от Ytch (?), 12-Июл-10, 21:32 
>пс: незнаю как поступит компилятор если переменная прописанна и не будет изменяться
>вообще
>ну типа в место константы - обычная переменная

В embedded-платформах обычно, если указан модификатор const, то в отдельной секции .const (точное название зависит от компилятора), а в зависимости от платформы, секция .const вообще может быть помещена в немодифицируемую память (типа flash program memory). Если модификатора const нет, то компиляторы обычно размещают переменные в секции с обычными переменными и инициализирует их при старте (то есть никак не учитывают тот факт, что они никогда не меняются) при этом размер растет, так как занимается двойной объем - сама переменная и данные (или код) для ее инициализации (при этом данные/код для инициализации в работе программы не используются - только один раз при старте).

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


Ответить | Правка | Наверх | Cообщить модератору

125. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +1 +/
Сообщение от filosofem (ok), 12-Июл-10, 22:22 
А зачем не изменяющиеся переменные, значение которых известно при компиляции и которые используются как константы(то есть нет никаких манипуляций с их адресом), вообще в памяти размещать и адресовать, в чем профит?
Ответить | Правка | Наверх | Cообщить модератору

128. "Продемонстрирован код, который по мнению SCO был скопирован ..."  –1 +/
Сообщение от Sw00p aka Jeromemail (?), 12-Июл-10, 22:48 
вот я об этом же
скорее всего опции оптимизации это учитывают
Ответить | Правка | Наверх | Cообщить модератору

132. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +1 +/
Сообщение от Ytch (?), 12-Июл-10, 23:30 
>вот я об этом же
>скорее всего опции оптимизации это учитывают

В некоторых компиляторах учитывают, в некоторых нет. Чтоб не полагаться на такие особенности лучше сразу написать const. А есть такие платформы и компиляторы под них, где даже const написать недостаточно, а надо еще и нестандартные ключевые слова писать (и хорошо если только директивами типа #pragma обойдется).

Ответить | Правка | Наверх | Cообщить модератору

131. "Продемонстрирован код, который по мнению SCO был скопирован ..."  –1 +/
Сообщение от Ytch (?), 12-Июл-10, 23:24 
Например, таблица синуса (часто нужна в цифровой обработке сигналов) на несколько килобайт или таблицы для преобразования кодировок.

Естественно, писать const int SuperVal = 5; большого смысла не имеет.

Ответить | Правка | К родителю #125 | Наверх | Cообщить модератору

173. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от pavlinux (ok), 15-Июл-10, 02:55 
>А зачем не изменяющиеся переменные, значение которых известно при компиляции и которые
>используются как константы(то есть нет никаких манипуляций с их адресом), вообще
>в памяти размещать и адресовать, в чем профит?

float *ptr = &3.14159265; // низя


const float PI = 3.14159265;
float *ptr = (float *)PI // можно

Ответить | Правка | К родителю #125 | Наверх | Cообщить модератору

102. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +1 +/
Сообщение от Карбофос (ok), 12-Июл-10, 18:36 
не обязательно. переменная может быть инициализирована, а не обнулена в след. строке и пр. кроме всего компайлер выдает предупреждения в случае подозрения отсутсвия инициализации.
Ответить | Правка | К родителю #24 | Наверх | Cообщить модератору

81. "Продемонстрирован код, который по мнению SCO был скопирован ..."  –3 +/
Сообщение от pavlinux (ok), 12-Июл-10, 16:05 
>Именно. В основном в драйверах и фирмварях.

Да ты что!!!


#include <linux/version.h>
#include <linux/module.h>

int my_init(void ) {

int i;
printk(KERN_DEBUG " TEST: i = %d \n", i);
return 0;
}

module_init(my_init);

MODULE_LICENSE("GPL v2");

# insmod ./test.ko
# dmesg

TEST: i = 0


Ответить | Правка | К родителю #23 | Наверх | Cообщить модератору

92. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от Sw00p aka Jeromemail (?), 12-Июл-10, 17:17 
1) /tmp/test/hello.c:8: warning: ‘i’ is used uninitialized in this function

2) Jul 12 18:15:59 localhost kernel: init_module() called = -255520756

Ответить | Правка | Наверх | Cообщить модератору

96. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от Sw00p aka Jeromemail (?), 12-Июл-10, 17:41 
>[оверквотинг удален]
>
>module_init(my_init);
>
>MODULE_LICENSE("GPL v2");
>
>
># insmod ./test.ko
># dmesg
>
>TEST: i = 0

соответсвенно из ниже следующих моих комментов - если вывести из блока переменную Ы
вот тогда будет

Jul 12 18:39:29 localhost kernel: init_module() called = 0

+ int i;
int my_init(void ) {

- int i;
printk(KERN_DEBUG " TEST: i = %d \n", i);
return 0;
}

Ответить | Правка | К родителю #81 | Наверх | Cообщить модератору

133. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от pavlinux (ok), 13-Июл-10, 02:33 
>[оверквотинг удален]
>
>Jul 12 18:39:29 localhost kernel: init_module() called = 0
>
>+ int i;
>int my_init(void ) {
>
>- int i;
> printk(KERN_DEBUG " TEST: i = %d \n", i);
> return 0;
>}

Не хочет...  
INT: i = 0


/*
*
*/
#include <linux/version.h>
#include <linux/module.h>

int i;

int my_init(void ) {

         printk(KERN_DEBUG "INT: i = %d\n", i);
return 0;

}

module_init(my_init);

MODULE_LICENSE("GPL v2");

# gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib64/gcc/x86_64-suse-linux/4.5/lto-wrapper
Target: x86_64-suse-linux
Thread model: posix
gcc version 4.5.0 20100628 [gcc-4_5-branch revision 161494] (SUSE Linux)

# uname -a
Linux suse64 2.6.32.16 #6 SMP PREEMPT Tue Jul 6 21:09:44 MSD 2010 x86_64 x86_64 x86_64 GNU/Linux

Ответить | Правка | Наверх | Cообщить модератору

139. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от Sw00p aka Jeromemail (?), 13-Июл-10, 10:49 
что не хочет ???

тут будет 0 - правильно (int i - глобальная)

##########################
#include <linux/version.h>
#include <linux/module.h>

int i;

int my_init(void ) {

         printk(KERN_DEBUG "INT: i = %d\n", i);
return 0;

}

module_init(my_init);

MODULE_LICENSE("GPL v2");
###########################

Ответить | Правка | Наверх | Cообщить модератору

144. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от pavlinux (ok), 13-Июл-10, 12:26 
>что не хочет ???
>тут будет 0 - правильно (int i - глобальная)

Я собственно о том, что не инициализирована переменная не обязана
принимать какие либо значения. Более того если от версии к версии
появляются какие-то постоянные значения это не есть хорошо.

Ответить | Правка | Наверх | Cообщить модератору

19. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от spanasikemail (ok), 12-Июл-10, 12:07 
Надеюсь, что нисколько.

Должно быть int i = 0;

Ответить | Правка | К родителю #8 | Наверх | Cообщить модератору

40. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от Andrew Kolchoogin (?), 12-Июл-10, 13:00 
Нет, не должно.

Таким образом вы экономите один store на каждый вызов функции. В случае, если это interrupt handler, экономия получается некислая. ;)

"Бездумная" инициализация автоматических переменных свидетельствует о непонимании того, как они обрабатываются.

Ответить | Правка | Наверх | Cообщить модератору

42. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от spanasikemail (ok), 12-Июл-10, 13:08 
>Нет, не должно.

Должно. Из-за этого столько багов, что лучше обнулять.

> свидетельствует о непонимании того

а, ну да, конечно. видимо, вы самый большой специалист.

вопрос: вот код
int i;
чему равна i в месте, где эта i используется в первый раз ?

ответ - неизвестно.

Ответить | Правка | Наверх | Cообщить модератору

44. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от Аноним (-), 12-Июл-10, 13:24 
Простите, но у вас какие-то дилетантские познания программирования на С. Вы ещё думаю удивитесь когда узнаете сколько в ядре goto. В месте где используется i  первый раз может быть все равно какое у неё значение, потому что использовать i можно первый раз на запись.
Ответить | Правка | Наверх | Cообщить модератору

48. "Продемонстрирован код, который по мнению SCO был скопирован ..."  –2 +/
Сообщение от spanasikemail (ok), 12-Июл-10, 13:32 
простите, уж какие есть :-)
"может быть", "может" - это не те слова, которые следует использовать при разработке надёжного ПО.

Ответить | Правка | Наверх | Cообщить модератору

60. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +2 +/
Сообщение от szh (ok), 12-Июл-10, 14:14 
вы использовали подмену понятий, разберитесь со смыслом выражения "может быть" в верхнем посте.
Ответить | Правка | Наверх | Cообщить модератору

108. "Продемонстрирован код, который по мнению SCO был скопирован ..."  –1 +/
Сообщение от spanasikemail (ok), 12-Июл-10, 19:12 
ничего я не использовал, смотрите примеры кода и выдержки из спецификаций.

насчёт того, в какой секции располагается такая переменная, действительно не уверен - как-то не было такой проблемы никогда, поэтому не изучал вопрос.

Ответить | Правка | Наверх | Cообщить модератору

114. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от axe (??), 12-Июл-10, 20:38 
>ничего я не использовал, смотрите примеры кода и выдержки из спецификаций.

похоже что вы видимо никогда ничего на С и не писали, иначе почему вы ничего не знаете о варнингах компилятора?

>насчёт того, в какой секции располагается такая переменная, действительно не уверен -
>как-то не было такой проблемы никогда, поэтому не изучал вопрос.

это стековая переменная... ппц, какой нафиг раздел предварительно инициализированных переменных, люди??? Функция будет не реентерабельной. Не порите чушь.

Ответить | Правка | Наверх | Cообщить модератору

115. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от spanasikemail (ok), 12-Июл-10, 20:40 
>похоже что вы видимо никогда ничего на С и не писали, иначе
>почему вы ничего не знаете о варнингах компилятора?

Да с чего вы взяли, что я не знаю ???

Ответить | Правка | Наверх | Cообщить модератору

121. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от Ytch (?), 12-Июл-10, 21:37 
>это стековая переменная... ппц, какой нафиг раздел предварительно инициализированных переменных, люди??? Функция
>будет не реентерабельной. Не порите чушь.

Уточнение: или стековая или регистровая. Остальное верно.

Ответить | Правка | К родителю #114 | Наверх | Cообщить модератору

116. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +1 +/
Сообщение от Аноним (-), 12-Июл-10, 20:43 
При разработке надежного ПО на C используют, как минимум, -Wall -pedantic, если на то пошло. И никаких лишних телодвижений делать не надо — проверить что может, а чего не может, способна и машина.

Ну а для реально надежного ПО - как обычно, доказательный подход, Карри-Говард, ATP и все такое.

Ответить | Правка | К родителю #48 | Наверх | Cообщить модератору

45. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от mma (?), 12-Июл-10, 13:24 
Это с чего вы решили? В общем как код напишите так у вас и будет - известно или нет. Ну или приведите РЕАЛЬНЫЙ пример когда из ядра где есть этот недостаток, в противном случае это бездумное следование шаблону.
Ответить | Правка | К родителю #42 | Наверх | Cообщить модератору

47. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от spanasikemail (ok), 12-Июл-10, 13:30 
какой недостаток ? что непроинициализирована переменная ? так выше цифра приведена.


Ответить | Правка | Наверх | Cообщить модератору

62. "Продемонстрирован код, который по мнению SCO был скопирован ..."  –1 +/
Сообщение от szh (ok), 12-Июл-10, 14:16 
> какой недостаток ? что непроинициализирована переменная ?

нет, где это может привести к ошибке.

Ответить | Правка | Наверх | Cообщить модератору

109. "Продемонстрирован код, который по мнению SCO был скопирован ..."  –3 +/
Сообщение от spanasikemail (ok), 12-Июл-10, 19:17 
примера кода из ядра привести не могу, хотя вот посмотрите тут уже "модуль" набросали.

да, я предпочитаю бездумно следовать этому шаблону. более того, ругаюсь очень сильно, когда вижу непроинициализированные при объявлении переменные.

это тупо лучше при отладке, когда каждый раз значение переменной известно, а не случайно, и ломает всё в непредсказуемом порядке.

в общем, пишите софт, пробуйте сами как лучше, я тут высказал своё мнение, имею право. вы пишете софт по-своему - тоже имеете право.


Ответить | Правка | Наверх | Cообщить модератору

126. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +1 +/
Сообщение от PereresusNeVlezaetBuggyemail (ok), 12-Июл-10, 22:34 
>примера кода из ядра привести не могу, хотя вот посмотрите тут уже
>"модуль" набросали.
>
>да, я предпочитаю бездумно следовать этому шаблону. более того, ругаюсь очень сильно,
>когда вижу непроинициализированные при объявлении переменные.

Ну а кому-то удобнее наоборот, когда все переменные компактно объявляются в одном месте, а присваивания идут естественным образом по ходу дела. Это помогает следить за их количеством, что в случае с именно C порой весьма актуально, и отслеживать логику работы функции, не дёргаясь глазами по коду с мыслью "а во что эта хрень была выставлена-то?". И что удобнее читать, вот это:

/* Взято из src/lib/libc/stdio/mktemp.c в OpenBSD-CURRENT */
static int
mktemp_internal(char *path, int slen, int mode)
{
        char *start, *cp, *ep;
        const char *tempchars = TEMPCHARS;
        unsigned int r, tries;
        struct stat sb;
        size_t len;
        int fd;

        len = strlen(path);
        if (len == 0 || slen >= len) {
                errno = EINVAL;
                return(-1);
        }
        ep = path + len - slen;

        tries = 1;
        for (start = ep; start > path && start[-1] == 'X'; start--) {
                if (tries < INT_MAX / NUM_CHARS)
                        tries *= NUM_CHARS;
        }
        tries *= 2;


или вот это?
/* Модифицированная версия */
static int
mktemp_internal(char *path, int slen, int mode)
{
        char *start, *cp;
        size_t len = strlen(path);
        char *ep = path + len - slen;
        char *start = ep;
        const char *tempchars = TEMPCHARS;
        unsigned int r, tries = 1;
        struct stat sb;
        int fd;

        if (len == 0 || slen >= len) {
                errno = EINVAL;
                return(-1);
        }

        for (; start > path && start[-1] == 'X'; start--) {
                if (tries < INT_MAX / NUM_CHARS)
                        tries *= NUM_CHARS;
        }
        tries *= 2;


Про то, что хороший код - читаемый код, думаю, рассказывать не надо. :) Ну а современный компилятор, как уже говорилось, спасёт от глупых ошибок.

К слову, C99-компиляторы (а объявление переменных в середине кода - это есть C99) тоже не подо все ныне используемые платформы есть...

Ответить | Правка | Наверх | Cообщить модератору

134. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от pavlinux (ok), 13-Июл-10, 02:44 
>>примера кода из ядра привести не могу, хотя вот посмотрите тут уже
>>"модуль" набросали.
>>
>>да, я предпочитаю бездумно следовать этому шаблону. более того, ругаюсь очень сильно,
>>когда вижу непроинициализированные при объявлении переменные.
>
>Ну а кому-то удобнее наоборот, когда все переменные компактно объявляются в одном
>месте, а присваивания идут естественным образом по ходу дела.

Да уж, а то некоторые приплюснутые сишнеги пишут типа такого кода


int func(void) {

int i, j;

for (i = 0; i < LIMIT; i++ )
      j += 2*i;
//  Далее строк 200 кода одной функции
//
...
// и вдруг резко

   int i = 5;
   for ( int j = 10; j < i; j++) // ну не дибилы?!
      {
       //...
    }
//
} // EOF func()

Ответить | Правка | Наверх | Cообщить модератору

158. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от Карбофос (ok), 14-Июл-10, 00:56 
разве gcc не заматерится по поводу двойного объявления переменной? такое возможно разве что при выделении блоков /*{..}*/
Ответить | Правка | Наверх | Cообщить модератору

159. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от pavlinux (ok), 14-Июл-10, 01:00 
>разве gcc не заматерится по поводу двойного объявления переменной? такое возможно разве
>что при выделении блоков /*{..}*/

На i матернётся, на j - нет.

Более того, сработает вот такой маразм


#define LIMIT 25

int main(void) {

        double i;
        long long j[25];

        for ( char i = 0; i < LIMIT; i++ )
                *j += 2*i;
        i = *j;
        for ( int j; j < i; j++);
return *j;
}


Ответить | Правка | Наверх | Cообщить модератору

160. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от Карбофос (ok), 14-Июл-10, 01:57 
обратил внимание только на i, поэнтому не уточнил. :) с j все понятно, ибо в теле цикла.
последний пример вообще стараюсь избегать, стыдно будет за такое перед коллегами.
Ответить | Правка | К родителю #159 | Наверх | Cообщить модератору

162. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от pavlinux (ok), 14-Июл-10, 02:20 
>обратил внимание только на i, поэнтому не уточнил. :)
> с j все понятно, ибо в теле цикла.

Тело цикла это уже иная область видимости? Сублокальная?! :)

А чё ... я не против :) если итераторы будут умирать после окончания цикла.

типа
     for (int i = 0; i < X; i++) {
      Z *= i*i;
     }

     while (int j) {
      X = j+i;      // а тут i уже будет not declared
     }

Ответить | Правка | К родителю #160 | Наверх | Cообщить модератору

163. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от PereresusNeVlezaetBuggyemail (ok), 14-Июл-10, 02:52 
>[оверквотинг удален]
>типа
>     for (int i = 0; i <
>X; i++) {
>      Z *= i*i;
>     }
>
>     while (int j) {
>      X = j+i;    
>  // а тут i уже будет not declared
>     }

Помнится, одно время в C++ так и сделали.

Ответить | Правка | К родителю #162 | Наверх | Cообщить модератору

167. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от Карбофос (ok), 14-Июл-10, 10:49 
>Тело цикла это уже иная область видимости? Сублокальная?! :)

по крайней мере, компайлер должен проглотить j и даже не вякать. такое тоже встречал o_O еще хуже даже видел, когда j объявлена как глобальная O_O потом почему-то начинается неожиданная хрень. :)

Ответить | Правка | К родителю #162 | Наверх | Cообщить модератору

170. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от pavlinux (ok), 14-Июл-10, 19:07 
>>Тело цикла это уже иная область видимости? Сублокальная?! :)
>
>по крайней мере, компайлер должен проглотить j и даже не вякать. такое
>тоже встречал o_O еще хуже даже видел, когда j объявлена как
>глобальная O_O потом почему-то начинается неожиданная хрень. :)

Это называется С99

Ответить | Правка | К родителю #167 | Наверх | Cообщить модератору

53. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +3 +/
Сообщение от бугага (?), 12-Июл-10, 13:53 
int i;

for (i = 0; i < 10; i++)
{
...
}

какой ужас, это не будет работать :D

Ответить | Правка | К родителю #42 | Наверх | Cообщить модератору

84. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +3 +/
Сообщение от angel_il (ok), 12-Июл-10, 16:33 
нет! этот код может работать неверно в боевых условиях, когда синус 90 гр. достигает трех и более.
Ответить | Правка | Наверх | Cообщить модератору

54. "Продемонстрирован код, который по мнению SCO был скопирован ..."  –1 +/
Сообщение от Аноним (-), 12-Июл-10, 13:58 
>Должно. Из-за этого столько багов, что лучше обнулять.

А не достаточно ли просто быть внимательней, а то напоминает: http://bash.org.ru/quote/396506

Ответить | Правка | К родителю #42 | Наверх | Cообщить модератору

55. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +1 +/
Сообщение от Sw00p aka Jeromemail (?), 12-Июл-10, 14:07 
>>"Бездумная" инициализация автоматических переменных свидетельствует о непонимании того, как они обрабатываются.

с чего это вы решили что это автоматическая переменная ???

Ответить | Правка | К родителю #40 | Наверх | Cообщить модератору

86. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от pavlinux (ok), 12-Июл-10, 16:38 
>>>"Бездумная" инициализация автоматических переменных свидетельствует о непонимании того, как они обрабатываются.
>
>с чего это вы решили что это автоматическая переменная ???

Хватит тролить. Курите маны на GCC.

.... спецификатор переменной всегда является auto, если не указано иного - static, extern или register.

Ответить | Правка | Наверх | Cообщить модератору

93. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +1 +/
Сообщение от Sw00p aka Jeromemail (?), 12-Июл-10, 17:32 
>>>>"Бездумная" инициализация автоматических переменных свидетельствует о непонимании того, как они обрабатываются.
>>
>>с чего это вы решили что это автоматическая переменная ???
>
>Хватит тролить. Курите маны на GCC.
>
>
.... спецификатор переменной всегда является auto, если не указано иного - static, 
>extern или register.
>

покурил (я тя уважаю)
читаем внимательно последний абзац

#########################

Спецификатор класса памяти в объявлении переменной может быть auto, register, static или extern. Если класс памяти не указан, то он определяется по умолчанию из контекста объявления.

Объекты классов auto и register имеют локальное время жизни. Спецификаторы static и extern определяют объекты с глобальным временем жизни.

При объявлении переменной на внутреннем уровне может быть использован любой из четырех спецификаторов класса памяти, а если он не указан, то подразумевается класс памяти auto.

Переменная с классом памяти auto имеет локальное время жизни и видна только в блоке, в котором объявлена. Память для такой переменной выделяется при входе в блок и освобождается при выходе из блока. При повторном входе в блок этой переменной может быть выделен другой участок памяти.

Переменная с классом памяти auto автоматически не инициализируется. Она должна быть проинициализирована явно при объявлении путем присвоения ей начального значения. Значение неинициализированной переменной с классом памяти auto считается неопределенным.

############################################################

ps:

Пример:
    int global_var;
    int func(void)
    { int local_var;                      /* по умолчанию auto  */
      static int *local_ptr=&local_var;   /*  так неправильно   */
      static int *global_ptr=&global_var; /*  а так правильно   */
      register int *reg_ptr=&local_var;   /*  и так правильно   */
    }

В приведенном примере глобальная переменная global_var имеет глобальное время жизни и постоянный адрес в памяти, и этот адрес можно использовать для инициализации статического указателя global_ptr. Локальная переменная local_var, имеющая класс памяти auto размещается в памяти только на время работы функции func, адрес этой переменной не является константой и не может быть использован для инициализации статической переменной local_ptr. Для инициализации локальной регистровой переменной reg_ptr можно использовать неконстантные выражения, и, в частности, адрес переменной local_ptr.


Ответить | Правка | Наверх | Cообщить модератору

94. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +1 +/
Сообщение от Sw00p aka Jeromemail (?), 12-Июл-10, 17:37 
>>>>"Бездумная" инициализация автоматических переменных свидетельствует о непонимании того, как они обрабатываются.
>>
>>с чего это вы решили что это автоматическая переменная ???
>
>Хватит тролить. Курите маны на GCC.
>
>
.... спецификатор переменной всегда является auto, если не указано иного - static, 
>extern или register.
>

в дополнении читаем внимательно 3 и 4 пункт

1.6.4. Инициализация глобальных и локальных переменных

При инициализации необходимо придерживаться следующих правил:

1. Объявления содержащие спецификатор класса памяти extern не могут содержать инициаторов.

2. Глобальные переменные всегда инициализируются, и если это не сделано явно, то они инициализируются нулевым значением.

3. Переменная с классом памяти static может быть инициализирована константным выражением. Инициализация для них выполняется один раз перед началом программы. Если явная инициализация отсутствует, то переменная инициализируется нулевым значением.

4. Инициализация переменных с классом памяти auto или register выполняется всякий раз при входе в блок, в котором они объявлены. Если инициализация переменных в объявлении отсутствует, то их начальное значение не определено.

5. Начальными значениями для глобальных переменных и для переменных с классом памяти static должны быть константные выражения. Адреса таких переменных являются константами и эти константы можно использовать для инициализации объявленных глобально указателей. Адреса переменных с классом памяти auto или register не являются константами и их нельзя использовать в инициаторах.

Ответить | Правка | К родителю #86 | Наверх | Cообщить модератору

124. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от Kash (??), 12-Июл-10, 22:01 
>[оверквотинг удален]
>
>4. Инициализация переменных с классом памяти auto или register выполняется всякий раз
>при входе в блок, в котором они объявлены. Если инициализация переменных
>в объявлении отсутствует, то их начальное значение не определено.
>
>5. Начальными значениями для глобальных переменных и для переменных с классом памяти
>static должны быть константные выражения. Адреса таких переменных являются константами и
>эти константы можно использовать для инициализации объявленных глобально указателей. Адреса переменных
>с классом памяти auto или register не являются константами и их
>нельзя использовать в инициаторах.

И как это противоречит процитированному утверждению?
По поводу явной инициализации: не вижу ничего плохого в объявлении переменных без явной инициализации в случае, когда им присваивается значение далее по коду. Есть ли какая-нибудь разница при записи в памяти поверх нулей или поверх мусора? Если же программист попробует использовать не инициализированную переменную, то его об этом известит компилятор, о чем выше писалось неоднократно.

Ответить | Правка | Наверх | Cообщить модератору

130. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от Sw00p aka Jeromemail (?), 12-Июл-10, 23:00 
>И как это противоречит процитированному утверждению?
>По поводу явной инициализации: не вижу ничего плохого в объявлении переменных без
>явной инициализации в случае, когда им присваивается значение далее по коду.
>Есть ли какая-нибудь разница при записи в памяти поверх нулей или
>поверх мусора? Если же программист попробует использовать не инициализированную переменную, то
>его об этом известит компилятор, о чем выше писалось неоднократно.

int func(void)
{
    int local_var;                      /* по умолчанию auto  */
    static int *local_ptr=&local_var;   /*  так неправильно   */
.........

тады обьясните почему неправильно ??

Ответить | Правка | Наверх | Cообщить модератору

135. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от pavlinux (ok), 13-Июл-10, 03:03 
>[оверквотинг удален]
>int func(void)
>{
>    int local_var;      
>          
>    /* по умолчанию auto  */
>    static int *local_ptr=&local_var;   /*  так
>неправильно   */
>.........
>
>тады объясните почему неправильно ??

Все правильно, только лишено какой-либо логики, кроме как для теста для компилятора и ОСи.

Глупо инициализировать переменные если они редко будут использоваться:


int func(int a, int b) {

  int i, j;
  
  if ( a < b )
     return -1;

  i = a*b;

  if ( i % 5 )
     return -1;

  j = i % 5;

return i+j;
}

Как видите, при a < b значения i и j пофигу какие.

Все это можно даже упростить до:


int func(int a, int b) {

  if ( a < b )
     return -1;
  if ( (a*b) % 5 )
     return -1;
  return (a*b)+((a*b) % 5);
}

Ответить | Правка | Наверх | Cообщить модератору

140. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от Sw00p aka Jeromemail (?), 13-Июл-10, 10:59 
>[оверквотинг удален]
>
 
>int func(int a, int b) {
>
>  if ( a < b )
>     return -1;
>  if ( (a*b) % 5 )
>     return -1;
>  return (a*b)+((a*b) % 5);
>}
>

нет не глупо особенно переменные которые попадают в локальную область видимости (без инициализации в них храниться мусор и порой это может стать причиной ошибки)

для глобальных - да типа "глупо"

Ответить | Правка | Наверх | Cообщить модератору

145. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от pavlinux (ok), 13-Июл-10, 12:34 
>>[оверквотинг удален]
>нет не глупо особенно переменные которые попадают в локальную область видимости (без
>инициализации в них храниться мусор и порой это может стать причиной ошибки)

Какая может возникнуть ошибка, если эту переменную я не использую?
От инициализированной локальной переменной вообще никакого толка.


int func(void) {

int i = 25; // шо такое 25 ?

do {
     i--;
} while ( i > 0 )

}


Заменяется на:

#define LIMIT 25

int func(void) {

int i;

for (i = LIMIT; i > 0; i--) {
}
}


Ответить | Правка | Наверх | Cообщить модератору

146. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от Sw00p aka Jeromemail (?), 13-Июл-10, 13:20 
у вменяемых такого рода ошибок не будет

int func(void)
{
    int local_var;                      /* по умолчанию auto  */
    static int *local_ptr=&local_var;   /*  так неправильно   */

Ответить | Правка | Наверх | Cообщить модератору

174. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от pavlinux (ok), 15-Июл-10, 03:21 
>[оверквотинг удален]
>
 
>int func(int a, int b) {
>
>  if ( a < b )
>     return -1;
>  if ( (a*b) % 5 )
>     return -1;
>  return (a*b)+((a*b) % 5);
>}
>

 
inline int func(int a, int b) {

return (a < b) ? -1 : (((a*b) % 5) ? -1 : (a*b)+((a*b) % 5));
}

Гы

 
inline int func(int a, int b) {

return (  ( (a < b) || ((a*b) % 5)) ) ? -1 : ( (a*b) + ((a*b) % 5) )  );
}


гы-гы
Ответить | Правка | К родителю #135 | Наверх | Cообщить модератору

58. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от Sphynkx (ok), 12-Июл-10, 14:10 
>Еще бы за использование "int main()" роялити потребовали и "int i;" запатентовали.

Надо с ними на их же языке говорить, чтоб заткнулись. Взять код какой-то неюниксовой ОСи, ровестницы юникса, найти и предъявить те же конструкции, имена переменных и пр. И пусть потом доказывают, то сами не воры и что "int i;" не сплагиировали ;-))

Ответить | Правка | К родителю #6 | Наверх | Cообщить модератору

79. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от Arcturus (?), 12-Июл-10, 16:01 
А может быть вообще какой-то базовый учебник по основам С/unix... :-)
Ответить | Правка | Наверх | Cообщить модератору

150. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от thesame (?), 13-Июл-10, 18:30 
>Надо с ними на их же языке говорить, чтоб заткнулись. Взять код
>какой-то неюниксовой ОСи, ровестницы юникса, найти и предъявить те же конструкции,
>имена переменных и пр. И пусть потом доказывают, то сами не
>воры и что "int i;" не сплагиировали ;-))

Ну зачем же так сложно?
Они сами на себя компромат выкатили - пример 251, syslog.h.
Имена констант и комментарии к ним совпадают.
В glibc-2.2.5/misc/sys/syslog.h:
* Copyright (c) 1982, 1986, 1988, 1993
*      The Regents of the University of California.  All rights reserved.
как того и требует лицензия Беркли.
Проследить историю этого файла вплоть до 82-83 годов можно благодаря коллекции МакКузика.

Отсюда следуют ровно две возможности:
- либо в SCO отрезали шапку Беркли (нарушили лицензию)
- либо они сознательно пытались ввести суд в заблуждение, утаивая информацию о происхождении кода

Ответить | Правка | К родителю #58 | Наверх | Cообщить модератору

151. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от thesame (?), 13-Июл-10, 18:33 
>Они сами на себя компромат выкатили - пример 251, syslog.h.

поправка - пример 247

Ответить | Правка | Наверх | Cообщить модератору

152. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от PereresusNeVlezaetBuggyemail (ok), 13-Июл-10, 18:36 
>[оверквотинг удален]
> *      The Regents of the University
>of California.  All rights reserved.
>как того и требует лицензия Беркли.
>Проследить историю этого файла вплоть до 82-83 годов можно благодаря коллекции МакКузика.
>
>
>Отсюда следуют ровно две возможности:
> - либо в SCO отрезали шапку Беркли (нарушили лицензию)
> - либо они сознательно пытались ввести суд в заблуждение, утаивая информацию
>о происхождении кода

А вариант, что это в BSD остался огрызок чужого кода, вы не рассматриваете? Я серьёзно.

Ответить | Правка | К родителю #150 | Наверх | Cообщить модератору

153. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от thesame (?), 13-Июл-10, 20:12 
>А вариант, что это в BSD остался огрызок чужого кода, вы не
>рассматриваете? Я серьёзно.

Нет. syslog.h из glibc-2.2.5 основан на дистрибутиве 4.4BSD-Lite2, который является лицензионно чистым (не содержит проприетарных файлов от AT&T) и был выпущен после судебного разбирательства BSD vs. USL.

Ответить | Правка | Наверх | Cообщить модератору

154. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от PereresusNeVlezaetBuggyemail (ok), 13-Июл-10, 20:15 
>>А вариант, что это в BSD остался огрызок чужого кода, вы не
>>рассматриваете? Я серьёзно.
>
>Нет. syslog.h из glibc-2.2.5 основан на дистрибутиве 4.4BSD-Lite2, который является лицензионно чистым
>(не содержит проприетарных файлов от AT&T) и был выпущен после судебного
>разбирательства BSD vs. USL.

То есть он появился _после_ того судебного разбирательства? Тогда это радует. :)

Ответить | Правка | Наверх | Cообщить модератору

156. "Продемонстрирован код, который по мнению SCO был скопирован ..."  +/
Сообщение от thesame (?), 13-Июл-10, 21:08 
>>Нет. syslog.h из glibc-2.2.5 основан на дистрибутиве 4.4BSD-Lite2, который является лицензионно чистым
>>(не содержит проприетарных файлов от AT&T) и был выпущен после судебного
>>разбирательства BSD vs. USL.
>
>То есть он появился _после_ того судебного разбирательства? Тогда это радует. :)
>

Если быть совсем точным, то копирайт _сохранился_ (1982, 1986, 1988, 1993), т.е. USL никогда не претендовала на то, что syslog - это их разработка.
А вообще, насколько я сумел понять, ноги syslog растут из sendmail (тоже берклиевская разработка).

Ответить | Правка | Наверх | Cообщить модератору

63. "Продемонстрирован код, который по мнению SCO был скопирован ..."  –1 +/
Сообщение от User294 (ok), 12-Июл-10, 14:22 
>Еще бы за использование "int main()" роялити потребовали и "int i;" запатентовали.

Так вот какой код скопировали из Unix в линух?! Блин, этак меня SCO тоже засудит за копипасту :(.

Ответить | Правка | К родителю #6 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру