Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Run Clang static analysis on Julia's C/C++ runtime and codegen, and satisfy the GC-rooting checker. Use after modifying runtime/codegen .c/.cpp files under src/ (excluding headers), before opening a PR.
.claude/skills/julialang-c-static-analysis/SKILL.md| Model | Eval pass | Runs |
|---|---|---|
| gemini-3.6-flash | 93% | 16 |
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | -68% | 0% |
| case-02 | ✗→✓ | ▲ Improved | -12% | 0% |
| case-03 | ✗→✓ | ▲ Improved | -2% | 0% |
| case-04 | ✗→✓ | ▲ Improved | -59% | 0% |
| case-05 | ✗→✓ | ▲ Improved | -44% | 0% |
Use this after you modify a runtime/codegen C/C++ source file under src/ (not headers). Note that runtime changes also require a rebuild (make -j).
Run static analysis checks:
make -C src install-analysis-deps to initialize dependencies (onlyneeded once the first time, or after the LLVM/Clang toolchain dependencies change). This may download and install LLVM/Clang artifacts.
src/jloptions.c or src/codegen.cpp, use the filestem without the .c/.cpp extension: sh make -C src analyze-<file-stem> -j8 [--output-sync] For example, to analyze src/jloptions.c, run: sh make -C src analyze-jloptions -j8 Add --output-sync when your make supports it to keep parallel output grouped; otherwise omit it.
clang-sa-<file-stem>,clang-sagc-<file-stem>, clang-safety-<file-stem> or clang-tidy-<file-stem>.
If clang-sagc-<file-stem> fails, first look for fixes that establish real rooting, such as adding appropriate JL_GC_PUSH/JL_GC_POP scopes, or for lock/control-flow fixes.
Do not add JL_GC_PROMISE_ROOTED without explicit user or maintainer confirmation. JL_GC_PROMISE_ROOTED asserts that a value is already rooted; it does not root the value. If it appears necessary, stop and ask for confirmation, showing the exact expression, the existing root that makes it safe, and the safepoints considered.
is handled.
moved through a struct or arraylist and then reloaded, the promised expression may need to refer to the reloaded field, such as JL_GC_PROMISE_ROOTED(struct->field), immediately after the reload and before any use of that field.
definition or reload rather than the use.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 25,394 | 22,641 | -11% | 1 | 1 | 0% | 3,796 | 1,227 | -68% | 0 | 0 | — |
case-02 | fail→pass | 58,238 | 15,746 | -73% | 1 | 1 | 0% | 2,294 | 2,014 | -12% | 0 | 0 | — |
case-03 | fail→pass | 22,355 | 7,960 | -64% | 1 | 1 | 0% | 1,368 | 1,334 | -2% | 0 | 0 | — |
case-04 | fail→pass | 33,615 | 24,984 | -26% | 1 | 1 | 0% | 3,298 | 1,363 | -59% | 0 | 0 | — |
case-05 | fail→pass | 54,169 | 4,889 | -91% | 1 | 1 | 0% | 2,288 | 1,272 | -44% | 0 | 0 | — |
case-06 | pass→pass | 17,486 | 7,417 | -58% | 1 | 1 | 0% | 2,069 | 1,597 | -23% | 0 | 0 | — |
case-07 | fail→pass | 31,909 | 8,249 | -74% | 1 | 1 | 0% | 2,301 | 1,520 | -34% | 0 | 0 | — |
case-08 | pass→pass | 13,009 | 9,837 | -24% | 1 | 1 | 0% | 1,863 | 1,240 | -33% | 0 | 0 | — |
case-09 | fail→pass | 20,857 | 8,077 | -61% | 1 | 1 | 0% | 2,681 | 1,704 | -36% | 0 | 0 | — |
case-10 | fail→pass | 9,979 | 3,693 | -63% | 1 | 1 | 0% | 1,439 | 1,068 | -26% | 0 | 0 | — |
case-11 | pass→pass | 23,426 | 3,246 | -86% | 1 | 1 | 0% | 1,907 | 980 | -49% | 0 | 0 | — |
case-12 | fail→pass | 82,217 | 3,460 | -96% | 1 | 1 | 0% | 6,522 | 1,006 | -85% | 0 | 0 | — |
case-13 | fail→pass | 13,059 | 6,668 | -49% | 1 | 1 | 0% | 1,897 | 955 | -50% | 0 | 0 | — |
case-14 | fail→pass | 48,672 | 3,808 | -92% | 1 | 1 | 0% | 4,983 | 1,018 | -80% | 0 | 0 | — |
case-15 | fail→pass | 10,626 | 2,790 | -74% | 1 | 1 | 0% | 1,649 | 890 | -46% | 0 | 0 | — |
case-16 | pass→pass | 6,977 | 3,039 | -56% | 1 | 1 | 0% | 797 | 803 | +1% | 0 | 0 | — |
case-17 | pass→pass | 9,766 | 8,437 | -14% | 1 | 1 | 0% | 1,486 | 1,215 | -18% | 0 | 0 | — |
case-18 | pass→pass | 28,293 | 7,795 | -72% | 1 | 1 | 0% | 2,028 | 1,402 | -31% | 0 | 0 | — |
case-19 | fail→pass | 17,998 | 13,389 | -26% | 1 | 1 | 0% | 2,423 | 1,578 | -35% | 0 | 0 | — |
case-20 | pass→pass | 11,784 | 3,876 | -67% | 1 | 1 | 0% | 1,548 | 1,090 | -30% | 0 | 0 | — |
case-21 | pass→pass | 23,947 | 12,269 | -49% | 1 | 1 | 0% | 2,207 | 2,008 | -9% | 0 | 0 | — |
case-22 | fail→pass | 10,930 | 6,081 | -44% | 1 | 1 | 0% | 1,644 | 1,203 | -27% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +64 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.