Bring CUDA source into a reviewable C++test workflow
Parasoft CUDA Bridge for Visual Studio 2026: implementation map, CUDA rule scope, test evidence, known limits, and questions for the Parasoft C++test product team
Embedded software consultancy, Parasoft and Perforce partner in Israel for over 20 years. ESL builds and supports the Parasoft CUDA Bridge.
linkedin.com/in/liezrowiceCUDA source enters the build through a different project item
C/C++test scopes ClCompile items; CUDA files are compiled through CudaCompile
Host C/C++ scope
C/C++test Professional scopes the familiar ClCompile extensions: .c, .cc, .cpp, and .cxx.
.cu uses CudaCompile
The CUDA build task is not a standard C++ compile item. The Bridge creates C++-recognizable companion inputs so C++test can analyze host-visible CUDA source.
A small adapter around installed engineering tools
One native CLI, one Visual Studio extension, one local rule pack
Prepare and run
pcb.exe is a .NET 10 NativeAOT win-x64 tool. It generates companion solutions, installs local rules, invokes analysis, maps findings, and runs supported tests.
Bring actions into VS
The net472 VSIX adds Parasoft CUDA commands, activation and legal UI, rule selection, configuration management, Error List findings, and editor squiggles.
CUDA guidance checks
Python rule scripts are generated into Parasoft RuleWizard files at build time. The source checks remain heuristic and are not a complete C++ front end.
CMake prepares a Visual Studio analysis solution
Six steps from a CMake CUDA folder to mapped findings
nvcc --dryrun to collect host defines, include paths, and options..vcxproj files and .cu.cpp source mirrors.*-parasoft.sln.Keep host-side compiler context close to nvcc
The companion project mirrors what nvcc would hand to the host compiler
- One companion project is produced for each CUDA project.
- Each
.cuis mirrored as.cu.cpp, usually as a hard link, with a copy fallback across volumes. - Definitions, include paths, forced includes, language options, and host flags come from evaluated build metadata and nvcc's dry-run.
- Source maps bring findings back to the original
.cupath and line. - The analyzer project is for analysis, not a replacement build target.
Use the customer's installation
The per-user CUDA compiler profile is adapted from the locally installed Parasoft profile. ESL does not ship Parasoft's base compiler profile or engine.
36 rule identifiers, with explicit heuristic boundaries
Coverage of the NVIDIA CUDA C++ Guidelines for Robust and Safety Critical Programming
CUDA-2_4 is opt-in for compute capability 6.0 and belowvectorAdd in the companion solution

.cu.cpp mirror, so this does not prove original-path presentationFive Flow Analysis findings, close up
Detail view of the same Flow Analysis Standard run on vectorAdd

Analyzer output
These are analyzer findings to review against source and build context, not confirmed defects.
Mirror path in this capture
The File column shows the generated .cu.cpp mirror, so this capture does not prove original-path presentation.
CUDA rule findings in native projects

Heuristic findings in a native Visual Studio capture
Separate run, separate counts
This native-project capture is not the CMake vectorAdd run. Its 16 warning entries are shown as heuristic CUDA findings.
The active E0029 entry is a separate IDE diagnostic. This screenshot is not evidence of a clean build.
Representative rule validation, not a compliance score
One selected Windows sample, measuring rule execution and output handling
Observed analyzer workload
6,008 StdViol records and zero failed targets in the selected sample. Two Linux-only targets were 0/0 and are not included in the Windows target count.
Interpretation
Violation records are not unique confirmed defects. This sample measures rule execution and output handling, not correctness, completeness, or safety compliance.
Keep each repository's scope beside its counts
Large open-source CUDA code bases, analyzed through companion solutions
| Project | StdViol | FlowViol | Files | Lines |
|---|---|---|---|---|
| llama.cpp | 40,919 | 559 | 702 / 702 | 376,144 |
| nvbench | 3,040 | 40 | 45 / 45 | 18,351 |
| MatX | 888 | None recorded | 26 / 28 | 6,289 / 6,427 |
| CUTLASS | 12,182 | 68 | 410 / 416 | 65,829 / 68,202 |
Native Visual Studio projects can run CUDA tests with host coverage
tests\*.cu and *.cpp for native .sln/.vcxproj projects.Choose where each run's findings appear
Bridge 0.8.0 asks after every run. This MISRA C++ 2023 run on vectorAdd reported 62 findings.

HTML report only
Open the run's HTML report.
Error List only
Publish findings with their C/C++test severity.
Both
HTML report and Error List together.
None
Show nothing now. The files are still written.
findings.json and an HTML report. Run kinds keep their own results; the clear command removes Bridge entries.MISRA C++ 2023 run in the Error List

[High], and double-click opens the source lineSeparate the ESL token from the Parasoft entitlement
ESL activation controls
ECDSA P-256 signed tokens, machine binding, versioned DPAPI-protected local state, stage/replay checks, grace handling, and rollback detection.
Parasoft checks are separate
Protected operations validate a genuine Parasoft-signed cpptestcli and run a checked-source analysis probe. An ESL token cannot grant Parasoft features.
Activation state in the About dialog

Activation state is visible inside the IDE
- Version and activation state.
- Days left in the current stage.
- The machine fingerprint used to issue a token.
- Contact links and buttons for each legal document.
ESL activation and Parasoft license
Activate with a signed token
PCB1- token issued by ESL
Machine-bound tokens issued by ESL
- The dialog shows the current activation state.
- Paste the
PCB1-token issued for this machine's fingerprint. - Tokens are ECDSA P-256 signed and machine bound.
Questions for the C++test product team
What is the supported long-term seam?
Is a generated Visual Studio companion solution the right approach, or is there a preferred C++test extension point for CUDA host analysis?
Can Parasoft review the adaptation?
We request feedback on the local compiler-profile patch, RuleWizard generation, and compatibility boundaries.
How should host-only coverage be presented?
What reporting or UI conventions best distinguish host coverage from non-instrumented device kernels?
Which acceptance criteria matter most?
Rule accuracy, setup friction, result navigation, compatibility, and supported configurations are open review topics.
What this evidence does not establish
- It does not prove complete C++ or GPU semantic analysis, full repository coverage, or compliance with CUDA guidance.
- It does not convert CUDA guideline heuristics into MISRA checks. They are separate analysis layers.
- It does not show CMake-native analysis or CMake-folder GoogleTest coverage.
- It does not include device-kernel coverage or guarantee findings are true defects.
- It does not establish Parasoft approval of the profile patch or rule generation.
CUDA Guidelines rule titles
CUDA-1_1Keep device-dependent operations inside program lifetimeCUDA-1_2Synchronize outstanding device work before terminationCUDA-1_3Inspect CUDA interface error resultsCUDA-1_4Check launch errors before another CUDA operationCUDA-1_5Do not manufacture CUdevice handles from integersCUDA-1_6Follow fork with exec before using CUDACUDA-1_7Keep execution specifiers consistentCUDA-1_8Pass trivial kernel arguments by valueCUDA-1_9Use managed storage for host kernel reference argumentsCUDA Guidelines rule titles
CUDA-1_10Do not guard declarations with CUDA architecture macrosCUDA-1_11Do not redefine CUDA implementation macrosCUDA-1_12Do not write constant memory from device codeCUDA-1_13Do not use thread_local in device codeCUDA-1_14Keep block synchronization uniformCUDA-2_1Only include participating lanes in warp collectivesCUDA-2_2Use valid power-of-two shuffle widthsCUDA-2_3Include calling and source lanes in warp masksCUDA-2_4Converge warp synchronization on older GPUs (opt-in)CUDA Guidelines rule titles
CUDA-3_1Call functions in their declared execution spacesCUDA-3_2Keep function pointers in their originating execution spaceCUDA-3_3Access objects only in accessible execution spacesCUDA-3_4Use at most one dynamic shared array per kernelCUDA-3_5Do not alias restricted function argumentsCUDA-4_1Configure every kernel callCUDA-4_2Only configure kernel functionsCUDA-4_3Do not pass polymorphic kernel arguments by valueCUDA-4_4Keep kernel launch bounds consistentCUDA Guidelines rule titles
CUDA-S1_1Do not register CUDA callbacksCUDA-S1_2Do not use device assemblyCUDA-S1_3Do not use device RTTI operatorsCUDA-S1_4Do not use long double in device codeCUDA-S1_5Restrict uses of const host variables in device codeCUDA-S1_6Restrict uses of constexpr host variables in device codeCUDA-S2_1Avoid unsafe deduced execution-space member pointersCUDA-S3_1Do not launch kernels while evaluating launch configurationCUDA-S3_2Do not launch kernels from device codeTraceable claims, bounded conclusions
NVIDIA CUDA C++ Guidelines 3.0.1
docs.nvidia.com/cuda/cuda-for-tegra-appnote/cudaguideV3.0.1.pdf
36 rules and 5 process directives.
Smoke runs, 26 October 2026
CMake-prepared vectorAdd companion-solution analysis and native CUDA GoogleTest smoke runs. Test logs and reports are local evaluation artifacts.
Engineering Software Lab Ltd. · sales@eswlab.com · eswlab.com · Daniel Liezrowice on LinkedIn
