2

假设我有一个 Matlab 函数,我更改了它的签名(即添加参数)。由于 Matlab 不“编译”,因此有一种简单的方法可以确定哪些其他函数不使用正确的签名(即提交附加参数)。我不想在运行时确定这一点(即收到错误消息)或必须进行文本搜索。希望这是有道理的。任何反馈将不胜感激。非常感谢。

4

2 回答 2

3

如果我理解正确,您想更改函数的签名并找到以“旧”方式调用它的所有函数/脚本/类,并将其更改为“新”方式。

您还表示您不想在运行时执行此操作,也不想进行文本搜索,但是无法在“解析时”检测到“不正确”的调用,所以恐怕这些要求根本没有选择检测旧的函数调用...

在这种情况下,我会临时在新函数中添加几行:

function myFunc(param1, param2, newParam) % <-- the NEW signature

    if nargin == 2
        clc, error('old call detected.'); end

然后运行主脚本/函数/该函数所在的任何内容。每次错误调用函数时,您都会收到一个错误,以及 Matlab 命令窗口中的错误堆栈。

然后只需单击错误堆栈底部的链接,更正函数调用,然后从顶部重复直到不再发生错误。

完成后不要忘记删除这些行,或者更好的是,将单词替换为errorjustwarning以捕获任何遗漏的内容。

更好的是:如果你在 linux 上,文本搜索将是一个问题

$ grep -l 'myFunc(.*,.*); *.m' 

这将列出所有具有“不正确”调用的文件。我想说这并不太难……您可能可以使用标准的 Windows 搜索做类似的事情,但我现在无法测试。

于 2012-11-27T09:40:47.920 回答
2

这或多或少是发明依赖报告的目的。使用该工具,您可以找到哪些函数/脚本调用您更改的函数。那么这只是一个手动检查每个事件的问题。

但是,我建议您对函数签名进行更改,以保持向后兼容性。您可以通过为新参数指定默认值和/或warning在这些情况下发出 a 来做到这一点。这样,您的代码将运行,并且您将获得已弃用代码的运行时提示(这在解释/动态语言中或多或少是必要的邪恶)。

对于许多动态语言(特别是 MATLAB),如果没有解释器执行代码,通常不可能完全检查代码。想象一下下面的代码:

x = magic(10);

通常,您会说该magic函数已被调用。但是,magic可以映射到完全不同的功能。这可以通过静态分析工具(例如依赖性报告)不可见的方式完成:例如eval('magic = 1:100;');.

唯一的方法是检查整个代码库,或者手动检查每个出现(可以通过文本搜索轻松找到),或者运行完全覆盖代码库的测试。

编辑:但是有一种方法可以访问 MATLAB 解析器的中间输出。这可以使用未记录和不受支持的mtree函数访问(可以这样调用:t = mtree(file, '-file');对于代码库中的每个文件)。使用生成的结构,您可能能够找到带有一定数量参数的调用。

于 2012-11-27T10:33:17.737 回答