SempGrep Java -Regel für den Schattenfeldname mit der Variablen
Posted: 26 Aug 2025, 09:00
Wir haben SEMGREP, das wir als statisches Codeanalyse -Tool verwenden dürfen. Ich versuche, eine Java -Regel zu schreiben, die überprüft, ob der variable Name genau den gleichen Namen wie der Feldname in derselben Klasse hat. Jetzt frage ich mich, ob es überhaupt möglich ist.
Erster Ansatz, von dem ich dachte
Ich dachte, es könnte funktionieren, da es denselben Shadow_Name wie der Feldname und als Variablenname verwendet. Es zeigt jedoch 0 Übereinstimmungen für den obigen Java-Code. < /P>
Der zweite Ansatz, den ich verwendet habe
Dieser Ansatz zeigt Ergebnisse für beide Muster in der Trennung, aber die Muster , die sie mit und standardmäßig anschließen.patterns:
- pattern: |
class $CLASS_NAME {
...
$FIELD_TYPE $FIELD_NAME = ... ;
...
}
- pattern: |
$RETURN_TYPE $METHOD_NAME(...) {
...
$VAR_TYPE $VAR_NAME = ...;
...
}
- metavariable-comparison:
comparison: $VAR_NAME == $FIELD_NAME
< /code>
Ich habe diesen Vergleich erwartet, um die Namen dieser beiden Metavariablen zu überprüfen. Zwei erste Muster erzeugen Übereinstimmungen, aber wenn es um den Vergleich geht, erzeugt es 0 Erkenntnisse
Code: Select all
public class ShadowingExample {
// This is a class field.
private String name = "Class Field";
public void example() {
String name = "Local Variable"; // The local variable 'name' shadows the field.
System.out.println("The class field is: " + this.name);
System.out.println("The local variable is: " + name);
}
public void anotherExample() {
System.out.println("Do something else first")
String name = "Local Variable"; // The local variable 'name' also shadows the field.
System.out.println("The class field is: " + this.name);
System.out.println("The local variable is: " + name);
}
}
Code: Select all
patterns:
- pattern: |
class $CLASS_NAME {
...
$FIELD_TYPE $SHADOW_NAME;
...
$RETURN_TYPE $METHOD_NAME(...) {
...
$VARL_TYPE $SHADOW_NAME =...;
...
}
}
Der zweite Ansatz, den ich verwendet habe
Code: Select all
patterns:
- pattern-inside: |
class $CLASS_NAME {
$FIELD_TYPE $SHADOW_NAME;
...
}
- pattern: |
$RET $M(...) {
...
$VAR_TYPE $SHADOW_NAME = ...;
...
}
- pattern: |
class $CLASS_NAME {
...
$FIELD_TYPE $FIELD_NAME = ... ;
...
}
- pattern: |
$RETURN_TYPE $METHOD_NAME(...) {
...
$VAR_TYPE $VAR_NAME = ...;
...
}
- metavariable-comparison:
comparison: $VAR_NAME == $FIELD_NAME
< /code>
Ich habe diesen Vergleich erwartet, um die Namen dieser beiden Metavariablen zu überprüfen. Zwei erste Muster erzeugen Übereinstimmungen, aber wenn es um den Vergleich geht, erzeugt es 0 Erkenntnisse