Проблема с строгой проверкой типов в lint (предупреждение 632)

Я работаю над доработкой некоторого существующего кода C, чтобы перенести его на новый компилятор (встроенное программное обеспечение, мы меняем оборудование). Итак, я пытаюсь очистить текущий код с помощью lint, и меня озадачивает задание, которое lint решил, что это нарушение строгой типизации.

Я получаю ошибку:

--- Module:   GenericFileName.c 
GenericFileName.c  ...  Warning 632: Assignment to strong type
(SubStructureType_T) in context: assignment

Строки кода, на которые он ссылается (имена изменены для удобства чтения):

void foo(void)
{
    extern const StructureType_T parent;    
    const SubStructureType_T *localChild;

    localChild = parent.child;   //<-- lint complains about this assignment
    ...
}

Соответствующие части StructureType_T:

typedef struct
{   
    const struct SubStructureType_T *child;
    ...
}StructureType_T;

И, наконец, опция lint для включения строгой проверки типов:

-strong(AcXJcb)

Приветствуется любое понимание. Я искал по этому поводу помощь, но мало что нашел. Думаю, линт - довольно старый инструмент. Спасибо за чтение!


person Scott S.    schedule 16.08.2011    source источник
comment
Где и как реально (глобально) определяется parent, для которого вы запросили внешнюю связь?   -  person Mahesh    schedule 16.08.2011
comment
Ой, очень хороший вопрос. Я должен был включить это. Это выглядит так: 'const StructureType_T parent = {0,0,0, ..., 0}'. Он живет в другом модуле.   -  person Scott S.    schedule 16.08.2011
comment
Это бесполезно. Поскольку вы сказали, что это старый инструмент, попробуйте установить значение NULL вместо 0 в списке инициализаторов для указателя.   -  person Mahesh    schedule 16.08.2011
comment
Это актуально? У меня есть определение после оператора #pragma tsection .parent. Из-за жизненно важного характера приложения мы используем этот тип вещей, чтобы тщательно продумать, где хранятся некоторые адреса.   -  person Scott S.    schedule 16.08.2011
comment
Пытался установить для него значение NULL в экземпляре, к сожалению, я все еще получаю предупреждение от lint.   -  person Scott S.    schedule 16.08.2011


Ответы (1)


Это const SubStructureType_T, как в foo, или const struct SubStructureType_T, как в typedef? Обратите внимание, что ключевое слово «структура» появляется только во втором определении.

Они одинаковы?

person pmg    schedule 16.08.2011
comment
О Конечно. Мне нужно указать struct в декларации для *localChild. Теперь я чувствую себя глупо. Спасибо! - person Scott S.; 16.08.2011
comment
+1, держу пари, что это все. Подробнее см. Вопрос Разница между struct и typedef struct. - person Adam Rosenfield; 16.08.2011
comment
@Adam @pmg Совершенно верно. Поскольку мне нужно использовать предварительное объявление, SubStructureType_T определяется следующим образом: typedef struct SubStructure_T{ ... } SubStructure_T;. Я не уверен, что какой-либо компилятор по ошибке попытался сделать localChild что-то странное без struct, но это исправление делает lint счастливым. Еще раз спасибо. - person Scott S.; 16.08.2011
comment
Что за вред держать typedef подальше от кода и набирать лишнее struct каждый раз, когда это необходимо? Не отвечайте: вопрос риторический :) - person pmg; 16.08.2011