static-analysis 相关问题

“静态分析”是指用于分析任意属性的应用程序代码的软件工具(或它们的用途),例如错误(未初始化的变量,可能的SQL注入攻击,这个代码死了,参数可以为null,...... )或结构(这段代码的调用图是什么?有重复的代码吗?组件之间传递什么信息?)。

PHP静态分析:根据参数值定义从对象模板返回的方法

这可能很难描述,这就是为什么我正在努力寻找匹配的答案。 这可能很难描述,这就是为什么我正在努力寻找匹配的答案。 <?php declare(strict_types=1); /** * @template T of object{'a': string, 'b': int, 'c': DateTime} */ class Foo { /** * @var object<T> */ private object $foo; // Assume __construct populates the $foo property /** * @param key-of<T> doesn't seem to apply here - only applies * to catching keys that aren't in T * * @return ??? indicate $key is a property of T, so return is that property's type */ public function get(string $key) { return $this->foo->{$a}; } } function string_only(string $a): string { return $a; } function integer_only(int $b): int { return $b; } // How do I know what was returned? $a = (new Foo)->get('a'); // $a should be treated as string by code analysis string_only($a); // OK integer_only($a); // Inspection type warning $b = (new Foo)->get('b'); // $b should be treated as int by code analysis string_only($b); // Inspection type warning integer_only($b); // OK $c = (new Foo)->get('c'); // Code completion should know I can do this $c->format('Ymd'); PhpStorm各种尝试的检查结果: // @return T<$key> // @return T{$key} string_only($a); // "Return value must be of type 'string', 'object' returned" // @return T->$key string_only($a); // "Return value must be of type 'string', 'T-' returned" 各种其他尝试不被识别为任何东西或给出类似于上面的内容。 可以使用任何当前的 PHP SA 工具来完成此操作吗? 我在 @return 注释中尝试了各种模式,但检查要么根本无法识别它们,要么表明函数返回一个对象而不是对象键的类型。 我希望静态分析工具能够理解 $key 的值代表 T 对象的属性。 Primero,需要纠正错误。例如,在您的方法中,使用 $key 和 $a 来使用。 继续使用 @psalm-param 和 @psalm-return 来恢复参数值。 有一个可能的解决方案: php Copy code declare(strict_types=1); /** * @template T of array{'a': string, 'b': int, 'c': DateTime} */ class Foo { /** * @var T */ private array $foo; // Supongamos que __construct llena la propiedad $foo /** * @psalm-param key-of<T> $key * @psalm-return T[$key] */ public function get(string $key) { return $this->foo[$key]; } } Usando @psalm-param key-of $key, estás diciendo que el valor de $key debe ser una de las claves del tipo T. Usando @psalm-return T[$key], estás diciendo que el Tipo de retorno debe ser el tipo del valor counteriente a la clave $key en T. Con estas anotaciones,诗篇 debería ser capaz de inferir que: (new Foo)->get('a') devuelve un string. (new Foo)->get('b') devuelve un int. (new Foo)->get('c') devuelve un DateTime.

回答 1 投票 0

Android Studio Lint 无法将 AppCompatActivity 识别为 FragmentActivity 的子类

我的MainActivity是AppCompatActivity的子类: 类 MainActivity : AppCompatActivity() { 在代码中的某些地方我使用了 FragmentActivity 的函数和属性,例如 invalidateMen...

回答 1 投票 0

如何使用 cppcheck 检测仅从未使用的函数调用的函数?

我正在尝试检测 C++ 中未使用的函数。目前我正在尝试使用 cppcheck 但我不知道是否可能或如何检测函数,这些函数仅由 functi 使用...

回答 3 投票 0

如何生成C++代码的调用图

我正在尝试生成一个调用图,用它来找出所有可能的执行路径(这样我就不必手动找出所有路径,因为...

回答 9 投票 0

如何告诉编译器抛出错误,因为变量未声明为“易失性”,但在中断处理程序中使用?

如果那些不打算注册或优化的变量仅在外部事件(嵌入式域中的中断内)内修改,我们需要将它们声明为易失性。 uint8_t ...

回答 1 投票 0

使用 Phpstan 获取数组键时如何避免 TypeError?

<?php /** * @return int[] */ function getIntArray(): array { return [100, 200]; } function setInt(int $value): void { echo $value; } $intArray = getIntArray(); setInt($intArray[2]); 此代码将导致错误: PHP Warning: Undefined array key 2 PHP Fatal error: Uncaught TypeError: setInt(): Argument #1 ($value) must be of type int, null given 但是 phpstan 没有显示错误: https://phpstan.org/r/ab7b85e4-2f96-4d6e-9ef7-20c99d5b163a phpstan 中是否有某种设置可以捕获此错误? 数组从 0 开始计数。您的 getIntArray() 函数返回一个包含两个值的数组。因此 $intArray[2] 返回 null。 尝试setInt($intArray[1]);。

回答 1 投票 0

Python 静态类型:如何告诉静态类型检查器我的函数已经检查了类型?

我有以下代码: ExprType: TypeAlias = int | 类型别名STR |约会时间 def check_type(值:ExprType,expected_type:类型[ExprType]): 如果不是 isinstance(值,expected_type): 提高典型...

回答 1 投票 0

如何关闭 Markdown 文件中的“MD024/no-duplicate-heading/no-duplicate-header:具有相同内容的多个标题”错误?

我有几个同名的部分,但位于不同的父部分中: # 页面标题 ## A 部分 ### 例子 ## B 部分 ### 例子 markdownlint linter 给了我这个警告: 医学博士...

回答 1 投票 0

找到导致函数被链接的调用链

我正在开发一个嵌入式系统,在使用 nm 分析二进制文件时,我发现了许多来自标准库函数的符号,例如: 00001524 std::time_get 我正在开发一个嵌入式系统,在使用 nm 分析二进制文件时,我发现了许多来自标准库函数的符号,例如: 00001524 std::time_get<char, std::istreambuf_iterator<char, std::char_traits<char> > >::_M_extract_via_format(std::istreambuf_iterator<char, std::char_traits<char> >, std::istreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, std::_Ios_Iostate&, tm*, char const*) const [clone .localalias] 这意味着有一个 std::time_get 函数被链接进来,它有 1524 字节大。 我想找出是什么调用链导致了对 std::time_get 的调用,因为我实际上并没有在代码的任何部分中引用它。 尝试使用链接器标志--cref并查看映射文件,我可以找到该符号,但找不到调用它的内容。它只告诉我 libstdc++_nano.a(locale-inst.o) 引用了它: .text._ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE21_M_extract_via_formatES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tmPKc 0x00000000080a07bc 0x5fc /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+dp/hard/libstdc++_nano.a(locale-inst.o) 0x00000000080a07bc std::time_get<char, std::istreambuf_iterator<char, std::char_traits<char> > >::_M_extract_via_format(std::istreambuf_iterator<char, std::char_traits<char> >, std::istreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, std::_Ios_Iostate&, tm*, char const*) const 我怎样才能从那里找到来电者? 您可以使用链接器-y标志来回答这个问题(尽管这非常乏味)。 示例: // foo.c int foo() { return 42; } // bar.c int bar() { return foo(); } // main.c int main() { return bar(); } gcc -w -c main.c foo.c bar.c ar r libfoo.a foo.o ar r libbar.a bar.o gcc main.o -L. -lbar -lfoo -Wl,-y,foo /usr/bin/ld: ./libbar.a(bar.o): reference to foo /usr/bin/ld: ./libfoo.a(foo.o): definition of foo 这告诉您 foo 已被选入链接,因为 bar.o 有对其的引用。重复bar: gcc main.o -L. -lbar -lfoo -Wl,-y,bar /usr/bin/ld: main.o: reference to bar /usr/bin/ld: ./libbar.a(bar.o): definition of bar 您还可以使用 -M 标志来获取相同的信息: gcc main.o -L. -lbar -lfoo -Wl,-M 将会有类似这样的输出: .text 0x0000000000001070 0xb9 /usr/lib/gcc/x86_64-linux-gnu/13/crtbeginS.o .text 0x0000000000001129 0x10 main.o 0x0000000000001129 main <<<--- .text 0x0000000000001139 0x10 ./libbar.a(bar.o) 0x0000000000001139 bar <<<--- .text 0x0000000000001149 0xb ./libfoo.a(foo.o) 0x0000000000001149 foo <<<--- <<<---标记显示哪个符号导致相应的.o被拉入链接。

回答 1 投票 0

禁止使用 detekt 调用 error() 方法

我希望禁止使用 error() 方法。 我的目标是禁止使用通用异常。如果代码显式抛出错误,我可以使用规则 TooGenericExceptionThrown 。然而,当人们使用电子...

回答 1 投票 0

VSCode:如何禁用特定文件的静态分析?

我有一些格式错误的 html 文件,用作单元测试的输入。我需要将它们格式化为我的测试的错误格式。如何将它们从 VSCode 的静态分析中排除? 我想继续

回答 1 投票 0

多元线性回归的F统计公式

任何人都可以帮助在线性回归的背景下逐步解释以下公式,以便与零函数进行比较: E{(TSS – RSS)/p} = σ^2 p:预测变量的数量 在

回答 1 投票 0

如何用LLVM的c++filt对opt生成的函数名进行反解析,以及如何发出一些中间节点?

我正在阅读这个答案,以使用 clang++-13 和 opt-13 生成一个美观的调用图 ❯ clang++-13 --版本 自制铿锵版本 13.0.1 目标:x86_64-apple-darwin22.5.0 线程模型:posix

回答 1 投票 0

如何生成易于阅读的调用图或者如何阅读它

我正在阅读这个答案,以使用 clang++-13 和 opt-13 生成一个美观的调用图 ❯ clang++-13 --版本 自制铿锵版本 13.0.1 目标:x86_64-apple-darwin22.5.0 线程模型:posix

回答 1 投票 0

release_handle - 检测双重释放

我正在尝试获取 clang 的 acquire_handle 和 release_handle 属性的句柄(du-dum-tsh)。我写过 int create_foo(void) __attribute__((acquire_handle("foo"))); 无效 destroy_fo...

回答 1 投票 0

Cppcheck 分析中估计 Qt Slot 错误的问题

在用Cppcheck进行静态分析时,在slots部分打印了相应的错误信息,但我不知道如何解决这部分。你能帮助我吗? err_msg :有一个未知的

回答 1 投票 0

可选[]类型在mypy中

我有以下嵌套函数 从输入 import 可选 定义外部( 外层_foo:int, 外部栏:可选[int] = 5 ): 返回内部(outer_foo,outer_bar) 定义内部( 内心_foo:...

回答 1 投票 0

SonarQube 是唯一的开源 SAST 工具吗

我想在我们的 CICD 管道上实现 SAST,但除了 sonarqube 之外我找不到开源 SAST 工具。有没有 sonarqube 的替代工具? 我只是想探索其他工具但找不到...

回答 2 投票 0

如何解决 Psalm 中的 DocblockTypeContradiction 问题

我有来自我的库的简化代码示例,由于我不明白的原因,诗篇会输出警告。 类示例{ 公共常量 C_1 = 'val1'; 公共常量 C_2 = 'val2';

回答 1 投票 0

如何解决MISRA代码中的“控制表达式不是‘本质上布尔’表达式”?

我有一个简单的宏函数,它将检查条件并返回布尔值。下面是代码片段 假设:#define boolean bool 测试.h文件 #定义CHECK_STATE(X) (

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.