очень странный глюк

Landstreicher

Наблюдается совершенно непонятный глюк.
В проге объявлена статическая переменная: static int a = 1;
Первым действием в программе вызывается функция print_a:
void print_a
{
printk("a is %d\n", a);
}
При этом выдается сообщение о том что a = 0.
Кроме объявления и функции print_a переменная больше нигде не используется. Как такое вообще может быть
Проверялось на 2 разных версиях gcc (2.95.3 и 3.0.4) - эффект одинаков.

abrek

Опять что-ли ядрёный модуль?
Там такое бывает, в чём прикол - не знаю, выяснишь - расскажешь

krishtaf

Все правильно это ведь статическая переменная
у нее всегда начальное значение = 0.

Dasar

А print_a откуда вызывается?
зы
Менее глючной считается следующая практика - static переменная заворачивается внутрь функции, для данного случая будет так:
void int& f_a
{
static int a = 1;
return a;
}
void print_a
{
printk("a is %d\n", f_a;
}

Dasar

С чего ты это взял? Здесь же, насколько я понял, 'a' явно инициализируется единицей.

Landstreicher

Да, действительно ядреный модуль. Однако, совсем прикольно становится:
static int a = 1;
static int b = 1;
static int c = 1;
void print
{
printk("a = %d\n", a);
printk("b = %d\n", b);
printk("c = %d\n", c);
}
При запуске:
a = 0
b = 1
c = 1
Похоже портится все что лежит по какому-то определенному смещению. Кстати, ядро при загрузке модуля не может подправить ему заголовок или что-то в таком духе, запортив ему начальную часть?

tokuchu

Возможно это какие-то фичи инициализации статических переменных? Предлагаю ещё проверить:

static int a = 1;
static int b = 1;
static int c = 1;
static int d = 1;
void print
{
printk("b = %d\n", b);
printk("c = %d\n", c);
printk("d = %d\n", d);
}


и

static int a = 1;
static int b = 1;
static int c = 1;
void print
{
printk("c = %d\n", c);
printk("b = %d\n", b);
printk("a = %d\n", a);
}

Landstreicher

Сабж. Проблема оказалась в следующем.
В модуле есть параметр объявленный как int, хотя на самом деле он short, то есть
static short parameter;
MODULE_PARM(parameter, "i");
Линкер сразу вслед на этим параметром положил мою переменную a.
При этом при загрузке модуля, ядро брало параметры и прописывало их в модуль, как следствие затирало первые 2 байта от моей перемнной. Я заменил "i" на "h", теперь все рабоает.
Большое спасибо всем кто откликнулся!
ЗЫ. Чего-то я стормозил... Модуль писал не я - поэтому не знал, что там есть такая подстава.
Оставить комментарий
Имя или ник:
Комментарий: