Skip to main content

Vulkro for Salesforce vs Salesforce Code Analyzer

Run the free analyzer. Then find out what it cannot see.

Salesforce Code Analyzer is free, official, and genuinely useful: PMD's Apex rules, linting for Lightning Web Components, and the Salesforce Graph Engine, which does real path-based analysis for the access-check family. Every Salesforce team should run it, and this page does not argue otherwise. The question worth answering before a submission is narrower: what does a rule engine not see, and does that matter to you. No head-to-head measurement exists between the two, so this page publishes no comparative score.

  • No head-to-head score published
  • Run the free analyzer either way
  • Runs on your machine
  • Code and live org

01 / The short answer

The free analyzer is the floor, not the ceiling

This is not a choice between two products so much as a question about where the free floor stops being enough. Read both columns and be honest about which describes your submission.

The free analyzer is enough if

The package is small and the org is simple

  • The Apex surface is small enough that a person can read every entry point and confirm the access checks by hand.
  • Your build is mostly declarative, with little dynamic SOQL and few caller-supplied field names.
  • Someone has the time to triage the access-check findings and separate the enforced paths from the real gaps.
  • Nobody needs a per-requirement readiness verdict or an audit of the running org.

Add Vulkro for Salesforce if

A submission, an org, or a client is on the line

  • You are queuing for an AppExchange Security Review and want a verdict against the published requirement categories before you pay for the slot.
  • You need the running org audited as well as the code: permissions, sharing, session settings, connected apps, installed packages.
  • The Apex is large enough that the access-check output has become a list nobody reads.
  • You need one report grouped the way a reviewer works, that you can hand to a client or attach to a submission thread.

Note what the second column does not say. It never says stop running the free analyzer, and adding a commercial tool is not a reason to switch off a free one that catches real defects.

02 / The architectural difference

A bundle of rule engines, against one engine that joins the project up

Two structural differences, and neither is that one tool has rules and the other has intelligence.

The free analyzer is a bundle of engines run by one command: an open-source Apex rule library, a linter for the Lightning and JavaScript side, and the Salesforce Graph Engine, which walks paths through the code to decide whether an access check is enforced before a record operation. That last part matters and is often misdescribed: the free stack does have path-based analysis. Its constraints are real too. The Graph Engine needs a complete, compilable project and a Java runtime, it costs materially more time than the pattern rules, and it is aimed at the access-check family rather than at every rule class. The pattern rules that cover the rest judge a statement on its own, which is why the classic Apex result is a long list of “add a check here” on lines where a check already exists three frames up the stack.

Vulkro for Salesforce is one engine over the whole project. The same pass reads Apex, Lightning, Aura, Visualforce, Flow and the metadata layer, and follows what a caller sent from the doors the platform opens, the @AuraEnabled, @HttpPost and @InvocableMethod entry points, through as many as five further methods, across instance and static field writes, in and out of collections, and through dynamic dispatch into the candidate implementations in scope. Every rule family sees that path, not only the access-check one, so injection, mass assignment, insecure deserialization and personal data reaching a log are all decided on the resolved route rather than on the shape of one line. It runs on the tree as it is on disk, with no compile step and no JVM.

The bound belongs with the claim. This is a cross-method engine rather than a general cross-file Apex trace, and the named path that crosses a file and a language boundary is the Lightning Web Component to Apex bridge.

vulkro-sf scan ./force-app4 hops
Dataflow pathCaller-chosen fields written to a record with no access check on the pathAPEX-XMETHOD-MASS-ASSIGN-002
  1. 01classes/QuoteController.cls:41entry pointsource

    @AuraEnabled updateQuote(Map<String, Object> payload) takes the payload from the client

  2. 02classes/QuoteController.cls:58helper

    applyFields() copies the payload keys onto the record with SObject.put

  3. 03classes/QuoteService.cls:132no enforcement on the path

    no isUpdateable, no WITH SECURITY_ENFORCED, no USER_MODE, no stripInaccessible between the caller and the write

  4. 04classes/QuoteService.cls:147sinksink

    update quotes runs in system mode with caller-chosen fields

4 hops resolved. The write is two methods away from the door it came through, and the enforcement question is about the whole route rather than the last line.

The route behind one Apex finding. A rule that judges the update statement on its own can neither confirm the gap nor rule it out.

The second difference is not about code at all. A permission set edited in Setup last Tuesday, a connected app somebody approved, a session policy relaxed for one integration and a managed package installed two releases ago are not in your repository, so no source analyzer can see them. They are also where a great deal of real Salesforce risk lives. The live-org audit runs through the Salesforce CLI login your team already has, reads definition objects and settings rather than customer records, and reports each check as pass, gap, or not evaluated.

vulkro-sf org report --target-org acme-prodexit 1
Target orgacme-prodNA142 - production - API 62.0 - read-only connected user
4pass
5gap
2not evaluated
11checks run
Live-org posture checks, each with a status of pass, gap or not evaluated
CheckRuleStatusSeverityEvidence
MFA enforcementvulkro-sf org mfaSF-MFA-001gapCRIT2 of 61 active users can log in with a password alone (no MFA, no SSO).
Guest user accessvulkro-sf org guest-liveSF-GUEST-LIVE-001gapHIGHGuest profile for site partner-portal holds Read on Contact and Opportunity.
Connected appsvulkro-sf org connected-appsSF-CONNECTED-APP-004gapHIGHBilling Sync uses an http:// callback URL and requests refresh_token scope.
Permission set assignmentsvulkro-sf org permsSF-PERM-ASSIGN-001gapMED4 users hold Modify All Data outside the admin permission set group.
Sandbox refreshvulkro-sf org sandbox-refresh-lagSF-SANDBOX-002gapMEDFull sandbox uat last refreshed 214 days ago; production data has drifted.
Session settingsvulkro-sf org sessionSF-SESSION-002passnoneTimeout 30 min, sessions locked to login IP, clickjack protection on.
Sharing rulesvulkro-sf org sharing-rulesSF-SHARING-002passnoneNo criteria-based rule grants Read/Write to All Internal Users.
Login historyvulkro-sf org login-historySF-LOGIN-HISTORY-002passnoneNo successful login from an unseen country in the last 30 days.
Trust statusvulkro-sf org trust-statusSF-PKG-VERIFY-001passnoneInstance NA142 has no open incident or maintenance on Salesforce Trust.
Event monitoringvulkro-sf org event-monitoringSF-EVENT-MON-001not evaluatedunknownEvent Monitoring is not licensed in this org, so there is no event stream to read.
Health check scorevulkro-sf org health-checkSF-HEALTH-CHECK-001not evaluatedunknownAPI returned 403 for this user. Grant View Setup and Configuration, then re-run.

Not evaluated is not a pass. Two checks could not run against this org, so two answers are still unknown.

The half of the review that no source analyzer can produce, because none of it is in the repository. A check the connected user could not run reads not evaluated, never a pass.

03 / Not measured

There is no head-to-head run, so there is no score

A page arguing that a paid tool sees more than a free one is exactly the page that should be most careful with numbers. So there are none.

No artifactNo committed run scores Vulkro for Salesforce against Salesforce Code Analyzer. The benchmark this site does publish (bench/comparison/scorecard-high.md · vulkro 0.18.0 · measured 2026-07-18) scores the general Vulkro scanner on web-application code and contains no Apex.

What this comparison does not measure, and the reason each figure is absent.
Not published hereWhat that meansWhy
A head-to-head scoreNo precision, recall or F1 comparison between the two tools appears here, because no run exists that scored them on the same Salesforce corpus.The Vulkro benchmark that does exist scores the general scanner on web-application code. That corpus contains no Apex, so it cannot rank either tool on Salesforce work.
How much of each tool’s output you would act onNo noise or precision figure is published here for either tool, in either direction.It depends on the codebase. Both are free to run over your own package during an evaluation, and the count of findings you would actually fix is the only comparison that decides anything.
What the Security Review will sayNo tool on this page, ours included, can tell you the outcome of an AppExchange Security Review.Salesforce Product Security decides that. A readiness verdict is a list of things to fix before you queue, which is useful, and it is not a pass.
Engine behaviour we did not re-verifyThe bundled engine set in the free analyzer has changed across major versions. Cells we could not confirm for the current release say so rather than guessing.Under-claiming for the other tool is as much a misrepresentation as over-claiming. Where we are unsure, the table says unsure.
The tools with a committed head-to-head run against Vulkro are listed with their scores on /proof and in /docs/benchmark. Salesforce Code Analyzer is not one of them, and no number on this page implies otherwise.

The Salesforce edition shares its engine with the scanner that was measured, but a shared engine is not a shared result. The measured result, and the boundary around it.

04 / Where the free tooling wins

Five things the official analyzer does better

Stated without a rebuttal attached, because they are true and because a comparison that cannot say this is not worth reading.

  • It is free, official, and already in your CLI

    Salesforce Code Analyzer installs as a plugin to the Salesforce CLI your team already has, runs in any pipeline, and costs nothing. There is no procurement conversation, no seat count and no evaluation to schedule. Every Salesforce team should be running it, and nothing on this page is an argument for switching it off.

  • PMD is open source, so a rule you disagree with can be read

    The engine behind most of the Apex rules is open source. When a finding puzzles you, the rule that produced it can be opened, argued with and changed, and a team can maintain its own rules in an idiom thousands of developers already know. Vulkro is a closed engine: what we publish instead is the benchmark method, the detector and checklist mapping, and every rule id, message and explanation the binary can print.

  • The Graph Engine does real path-based analysis, free

    The bundled Salesforce Graph Engine is not a pattern matcher. It walks paths through the code to decide whether an access check is enforced before a record operation, which is exactly the right shape for the CRUD and FLS family. Anyone claiming the free stack has no dataflow analysis is wrong, and this page will not make that claim.

  • It is the shared vocabulary of the ecosystem

    Its rule names are the ones Salesforce developers, reviewers and consultants already recognise, its output format is the one that turns up in every pipeline and every partner conversation, and a finding from it needs no explanation of where it came from. That is worth a great deal in a review thread.

  • It covers ground beyond Apex

    Linting for Lightning Web Components and checks over the JavaScript that ships in static resources come in the same bundle, so a single command covers several file types on a Salesforce project without assembling anything.

05 / Coverage

Capability against capability

Not a scoreboard. Every cell is a capability statement, the first row is the one most readers weigh hardest, and a cell we could not confirm says so.

Capability comparison between Vulkro for Salesforce and the free Salesforce Code Analyzer, with unconfirmed cells marked.
CapabilityVulkro for SalesforceSalesforce Code Analyzer
Cost and availabilityCommercial. Licensed per seat, directly through our team, after a 14-day trial of the full productFree, official, installed as a Salesforce CLI plugin
Where the analysis runsYour machine, one static binary, no runtime to installYour machine, through the Salesforce CLI (the Graph Engine needs a Java runtime)
Apex rule checksA Salesforce rule set written for the platform, plus a rule SDK for your ownYes, a broad and well-known open-source rule library
Follows a caller’s value across Apex methodsYes, on every scan: entry point, helper chain, field writes, collections, dynamic dispatchYes for the CRUD and FLS family, through the Graph Engine, on a complete compilable project
Injection, mass assignment, insecure deserialization, PII in logs, open redirectYes, decided on the resolved path rather than on the statement alonePattern rules cover several of these; path-based analysis is scoped to the access-check family
Flow definitions read as logicYes, including guest-user reachability and Apex actionsA Flow analysis engine is bundled; its depth is not verified here
Metadata layer (profiles, permission sets, connected apps, named credentials, CORS and CSP)Yes, read as part of the same projectNot a documented capability
Agentforce topics, actions and prompt groundingYes, resolved from the topic and action metadata in the checkoutNot a documented capability
Live-org posture auditYes, through your own Salesforce CLI login: permissions, sharing, session and MFA settings, connected apps, installed packagesNo. It reads the code in your project, not the running org
AppExchange Security Review readiness verdictYes: six requirement categories, a ten-gate pass and fail table, and one self-contained HTML report pinned to a checklist versionNo. It reports rule violations, not a per-requirement verdict
Managed-package and static-resource dependency analysisYes, matched offline against a bundled feedJavaScript dependency checks are part of the bundle
Custom rulesA rule SDK (regex, XML, Apex AST and compound), plus translation of Apex rule definitions from Semgrep or Checkmarx exportsYes, in the open-source rule idiom, with the rule source readable
Capability comparison, not a measurement: no cell here is a score. The Vulkro column is read from the shipped vulkro-sf command set; the Code Analyzer column is read from Salesforce's public documentation for the analyzer and its bundled engines, and a cell that documentation does not settle for the current release says so. The bundled engine set has changed between major versions, so check the current documentation before you decide. No price appears for either product.

The first row is deliberately at the top. One of these costs nothing, and any argument for the other has to clear that bar rather than talk around it.

06 / Running both

Keep the free analyzer in CI. Add the review before you submit.

There is nothing to migrate and no conflict to manage. The two run in the same pipeline and answer different questions.

The pattern that works is simple. The free analyzer stays on every pull request as the always-on baseline: it costs nothing, it catches real defects, and its vocabulary is the one your team and your reviewers already share. Vulkro for Salesforce runs where the stakes justify a second opinion: before a submission, before handing an org back to a client, and on a schedule against the running org, which no source analyzer reads.

Both are command-line tools that exit non-zero on findings, so two steps in one job is the whole integration. The Salesforce edition can also be told to fail only on findings that are new against a base ref, which keeps a long-standing backlog from blocking an unrelated change while still catching what the current change introduced.

If the submission is the reason you are here, run the readiness verdict early rather than the week before you queue. It groups everything the scan found into the published requirement categories, marks each one pass, gap or not evaluated, and prints the gate table your pipeline can fail on. The readiness checklist, item by item walks the same ground by hand, and how ISVs run this before a submission is the longer version.