public static void foo()
{
var x = new List{1,2,1};
// ruleid: todictionary-crash
Dictionary bad = x.ToDictionary(i=>i,i=>i.ToString());
Dictionary good = x.GroupBy(i=>i).ToDictionary(i=>i.Key,i=>i.First().ToString());
}
< /code>
rules:
- id: todictionary-crash
languages:
- csharp
severity: ERROR
message: Semgrep found a match
patterns:
- pattern-regex: ToDictionary
- pattern-not-regex: GroupBy\(.*\)\.ToDictionary
< /code>
Но как это сделать с «реальными» образцами Semgrep? Если я < /p>
patterns:
- pattern: $X.ToDictionary(...)
- pattern-not: $X.GroupBy(...).ToDictionary(...)
это также улавливает хорошие экземпляры (аналогично шаблону-inside ).
https://semgrep.dev/playground/s/6x3lb показывает, как можно использовать режимы, чтобы найти Todictionary без группы, т.е. [code]public static void foo() { var x = new List{1,2,1};
// ruleid: todictionary-crash Dictionary bad = x.ToDictionary(i=>i,i=>i.ToString());
Dictionary good = x.GroupBy(i=>i).ToDictionary(i=>i.Key,i=>i.First().ToString()); } < /code> rules: - id: todictionary-crash languages: - csharp severity: ERROR message: Semgrep found a match patterns: - pattern-regex: ToDictionary - pattern-not-regex: GroupBy\(.*\)\.ToDictionary < /code> Но как это сделать с «реальными» образцами Semgrep? Если я < /p> patterns: - pattern: $X.ToDictionary(...) - pattern-not: $X.GroupBy(...).ToDictionary(...) [/code] это также улавливает хорошие экземпляры (аналогично шаблону-inside ).