2016-03-30 2 views
1

Je suis actuellement aux prises avec PC-Lint (version 9.00j et l), ce qui me donne quelques erreurs et avertissements pour un morceau de code. Le code compile bien et fonctionne comme prévu. Voici une version simplifiée de celui-ci:Etranges erreurs PC-Lint avec les modèles de membres

#include <iostream> 
#include <vector> 

typedef unsigned char uint8_t; 

class Test 
{ 
    uint8_t   inputList[10]; 
    std::vector<int> resultList; 

public: 

    Test() : resultList() 
    { 
    for (uint8_t ii = 0; ii < 10; ++ii) 
     inputList[ii] = ii; 
    } 

    template<int list_size, typename ResultListType> 
    void loadList(const uint8_t (& inputList)[list_size], 
       ResultListType & resultList) const 
    { 
    for (uint8_t ii = 0; ii < list_size; ++ii) 
     resultList.push_back(inputList[ii]); 
    } 

    void run() 
    { 
    loadList(inputList, resultList); 
    } 

    void print() 
    { 
    std::vector<int>::iterator it; 
    for (it = resultList.begin(); it != resultList.end(); ++it) 
     std::cout << *it << std::endl; 
    } 
}; 

int main() 
{ 
    Test t; 
    t.run(); 
    t.print(); 
} 

Lors de l'exécution de cette dans la démo en ligne de Gimpel, je reçois ces erreurs et les avertissements:

30  loadList(inputList, resultList); 
diy.cpp 30 Error 1025: No template matches invocation 'Test::loadList(unsigned char [10], std::vector<int>)', 1 candidates found, 1 matched the argument count 
diy.cpp 30 Info 1703: Function 'Test::loadList(const unsigned char (&)[V], <2>&) const' arbitrarily selected. Refer to Error 1025 
diy.cpp 30 Error 1032: Member 'loadList' cannot be called without object 
diy.cpp 30 Error 1058: While calling 'Test::loadList(const unsigned char (&)[V], <2>&) const': Initializing a non-const reference '<2>&' with a non-lvalue (a temporary object of type 'std::vector<int>') 
diy.cpp 30 Warning 1514: Creating temporary to copy 'std::vector<int>' to '<2>&' (context: arg. no. 2) 

Donc, fondamentalement, PC-Lint essaie de me dire que ce trouvera simplement les bons paramètres de gabarit par hasard et que seule une copie temporaire du vecteur sera remplie. Mais le code fonctionne bien, le resultList contient les données!

Quelqu'un peut-il me dire ce qui se passe ici? Est-ce que PC-Lint est juste et que quelque chose ne va pas ou est-ce juste un bug PC-Lint?

Répondre

0

Le problème est que loadList est marqué comme const, et vous passez encore une référence non constante à la variable membre resultList que vous modifier.

Il est vrai que la fonction ne modifie loadList modifie pas directement this instance mais puisque vous encore une variable membre de la fonction ne peut pas être constante.

Vous pouvez créer un vecteur temporaire que vous passez à la fonction ou ne pas rendre la fonction const.

+0

Je reçois les mêmes erreurs/avertissements en omettant ce const. Je l'ai ajouté car il a été mentionné dans la description de l'erreur [1058] (http://gimpel-online.com/MsgRef.html#1058) – craesh

+0

@craesh Cela fonctionne très bien si vous spécifiez explicitement les arguments du template, comme dans ' oadList <10, std :: vector > (inputList, resultList) '. Je dirais avec prudence que c'est un problème avec la correspondance de modèle et la résolution de surcharge dans PC-lint. –

+0

Cela fonctionne même si je ne spécifie que le premier argument, la taille. Je me souviens d'avoir eu un problème similaire il y a quelque temps, il a été résolu par '// lint -fvl'. Les tableaux de longueur variable sont une extension GNU qui est obscurément activée dans la config ... – craesh