2016-09-11 2 views
4

J'utilise luacheck (dans l'éditeur Atom), mais ouvert à d'autres outils d'analyse statique.lua analyse statique: détection de champ de table non initialisé

Y at-il un moyen de vérifier que j'utilise un champ de table non initialisé? J'ai lu les docs (http://luacheck.readthedocs.io/en/stable/index.html) mais peut-être que j'ai manqué comment faire ceci?

Dans les trois cas dans le code ci-dessous, j'essaie de détecter que j'utilise (à tort) le champ 'y1'. Aucun d'entre eux ne le fait. (Au moment de l'exécution, il est détecté, mais j'essaie de l'attraper avant l'exécution).

local a = {} 
a.x = 10 
a.y = 20 
print(a.x + a.y1)   -- no warning about uninitialized field y1 !? 

-- luacheck: globals b 
b = {} 
b.x = 10 
b.y = 20 
print(b.x + b.y1)   -- no warning about uninitialized field y1 !? 

-- No inline option for luacheck re: 'c', so plenty of complaints 
-- about "non-standard global variable 'c'." 
c = {}     -- warning about setting 
c.x = 10     -- warning about mutating 
c.y = 20     --  "  "  " 
print(c.x + c.y1)   -- more warnings (but NOT about field y1) 

Le point est ceci: que les projets se développent (fichiers grandir, et le nombre de modules & taille grandir), il serait bon d'éviter les erreurs simples comme celui-ci de se glisser dans

Merci..

+0

https://github.com/mpeterv/luacheck/issues/46 https: // github .com/mpeterv/luacheck/issues/39 Tout simplement il n'est pas là. – Green

+0

Merci - bon de savoir que je ne manquais pas quelque chose, et que peut-être il pourrait être adressé à luacheck. –

+0

En effet, l'accès aux champs non initialisés ne figure pas dans la liste des problèmes détectés par luacheck: http://luacheck.readthedocs.io/en/stable/warnings.html. Je prévois de travailler là-dessus. – mpeterv

Répondre

2

lua-inspect devrait être capable de détecter et de rapporter ces instances. Je l'ai intégré dans ZeroBrane Studio IDE et lors de l'exécution avec le deep analysis il indique ce qui suit sur ce fragment:

unknown-field.lua:4: first use of unknown field 'y1' in 'a' 
unknown-field.lua:7: first assignment to global variable 'b' 
unknown-field.lua:10: first use of unknown field 'y1' in 'b' 
unknown-field.lua:14: first assignment to global variable 'c' 
unknown-field.lua:17: first use of unknown field 'y1' in 'c' 

(Notez que le code d'intégration ne signale que les premiers cas de ces erreurs pour minimiser le nombre de cas signalés, je aussi corrigé un problème qui signalait uniquement la première instance inconnue d'un champ, vous pouvez donc utiliser le dernier code du repository.)

+0

ce que j'ai essayé: ZeroBraneStudio Lua IDE, v1.4; Édition/Préférences/Paramètres: Utilisateur avec cette ligne ajoutée: staticanalyzer.infervalue = false. Ensuite, faites Project/Analyze - Je reçois des plaintes à propos des globals 'b' et 'c', mais aucune mention de 'y1'. Je suis très nouveau (utilisateur pour 10 minutes, maintenant) si possible que je n'ai pas fait correctement "l'analyse approfondie" que vous mentionnez. –

+0

@JLPLabs, utilisez 'staticanalyzer.infervalue = true'. Pour obtenir également les rapports sur 'b' et' c', vous devez obtenir le dernier code du dépôt (car le 1.4 ne contient pas les dernières modifications). –

+0

Cela fonctionne bien lorsque la table est locale et les clés sont constantes, mais j'ai de nombreux faux positifs lors de l'analyse du code "réel". Il semble que quand lua-inspect ne peut pas déduire le type d'une valeur, il produit un avertissement chaque fois qu'il est indexé. – mpeterv