天道酬勤,学无止境

is there a tool that will detect a recursive function call in C code? [closed]

I need to search and eliminate recursive function calls in an inherited code base. Thus far I was unable to find any tool that will do a static analysis and find these functions.

标签

评论

You might want to try cflow:

The cflow utility shall analyze a collection of object files or assembler, C-language, lex, or yacc source files, and attempt to build a graph, written to standard output, charting the external references.

It should print a callgraph and mark the recursive functions.

If your code has indirect calls thru function pointers, detecting recursive calls in it could be extremely difficult (and probably impossible in the general case, since equivalent to the halting problem.).

But I am not sure at all that eliminating recursion is worth the effort. For some recursive algorithms or problems, you'll just replace it by simulating it with a stack (in heap), and that don't help much (and makes the code unreadable).

A more pragmatic solution (at least on Linux) would be to limit the stack size, and run tests till they break by filling the stack. Then you can use the debugger to understand how it happens.

I think you should not bother that much about recursion...

CIL can produce a CFG for C programs, but it is a bit like using a sledgehammer to put in a staple.

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何检测到StackOverflowException?(How is a StackOverflowException detected?)
    问题 TL; TR 当我问这个问题时,我假设StackOverflowException是一种防止应用程序无限运行的机制。 这不是真的。 未检测到StackOverflowException 。 当堆栈没有分配更多内存的能力时,将抛出该错误。 [原始问题:] 这是一个普遍的问题,每种编程语言可能会有不同的答案。 我不确定除C#之外的其他语言如何处理堆栈溢出。 我今天正在经历异常,并一直在思考如何检测到StackOverflowException 。 我相信如果堆栈深度为1000,则不可能说fe,然后抛出异常。 因为也许在某些情况下正确的逻辑会那么深。 在程序中检测到无限循环背后的逻辑是什么? StackOverflowException类: https://msdn.microsoft.com/de-de/library/system.stackoverflowexception%28v=vs.110%29.aspx StackOverflowException类文档中提到的交叉引用: https://msdn.microsoft.com/de-de/library/system.reflection.emit.opcodes.localloc(v=vs.110).aspx 我只是将stack-overflow标签添加到了这个问题,并且描述说当调用栈消耗太多内存时,它会被抛出。
  • IntelliJ IDEA 2020 的Debug功能也太好用了,真香!
    写在前边 作为一个有点强迫症的程序员来说,所有的应用软件、开发工具都必须要升级到最高版本,否则就会很难受到坐立不安、日思夜想、茶饭不思。至于什么时候得的这种病我也记不清了,哈哈哈 IntelliJ IDEA 作为工作最常用的开发工具之一,自然就成了我的主要升级对象,早上在逛IntelliJ IDEA 官网时,惊奇的发现居然有新版本更新,这让我有点喜出望外,没说的果断下载! IntelliJ IDEA 2020.1 这个版本除了修复日常bug,对调试器和事件探查器(Profiler)进行了改进,并引入了新的提交工具窗口(Commit toolwindow)以及禅模式(Zen Mode)。 debug升级 IntelliJ IDEA 2020.1 向调试器添加了数据流分析协助功能(dataflow analysis assistance),此功能根据程序执行的当前状态预测并显示可能的异常以及始终为真/假的条件。 我们说的在明白一点就是当我们调试 Java 代码并到达断点时,IDE 将基于程序的当前状态运行数据流分析,并向我们显示在代码执行到该断点之前下一步将发生的情况: 举个简单的例子: public void test(){ int a = 1 ; int b = 2 ; int c = a + b; } 之前 debug 代码时只有当断点走到 int c = a + b;时才会显示
  • PHP中的无效代码检测(Dead code detection in PHP [closed])
    问题 从目前的情况来看,这个问题不适合我们的问答形式。 我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意测验或进一步的讨论。 如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 我有一个项目的代码非常混乱-到处都有很多重复和无效代码。 一段时间以前,单元测试的代码覆盖率为零,但现在我们试图以TDD方式编写所有新代码,并通过单元测试覆盖“旧”代码来降低技术负担(最后测试技术)。 业务逻辑的复杂度很高,有时没有人能回答是否使用某些方法。 如何找到这种无效代码方法? 广泛的日志记录? 更高的测试覆盖率?(这不是很容易,因为客户希望推出新功能) 回答1 xdebug的代码覆盖工具使您可以测试实际执行的代码行,而无需在所有函数/方法中放入跟踪语句。 例子: <?php xdebug_start_code_coverage(); function a($a) { echo $a * 2.5; } function b($count) { for ($i = 0; $i < $count; $i++) { a($i + 0.17); } } b(6); b(10); var_dump(xdebug_get_code_coverage()); // array '/path/file.php' => array line
  • 通过lsass远程提取凭据
    通过lsass远程提取凭据 luochicun 嘶吼专业版 在企业***测试中,横向移动感染和权限提升是测试***范围和扩大***力的两个必选项。有多种方法可以实现其中一种,但是今天我们将介绍一种远程读取lsass转储内容的新技术,这将极大地减少在一组计算机上提取密码时的延迟和检测。 lsass.exe是一个系统重要进程,用于微软Windows系统的安全机制。它用于本地安全和登陆策略。如果结束该进程,会出现不可知的错误。注意:lsass.exe也有可能是Windang.worm、irc.ratsou.b、Webus.B、MyDoom.L、Randex.AR、Nimos.worm等病毒创建的,病毒通过软盘、群发邮件和P2P文件共享进行传播。 CrackMapExec CrackMapExec(CME)是一款后***利用工具,可帮助自动化大型活动目录(AD)网络安全评估任务。该工具利用AD内置功能/协议达成其功能,并规避大多数终端防护/IDS/IPS解决方案。 CrackMapExec工具由Byt3bl33d3r开发和维护的,其目的是异步地能够在一组计算机上执行操作。该工具允许你使用域或本地帐户以及密码或LM-NT哈希在远程计算机上进行身份验证。 CrackMapExec是采用模块化方式开发的,可以创建该工具在登录到计算机时将执行的自己的模块。模块已经很多了,例如枚举不同的信息(DNS
  • 您如何检测/避免(非托管)代码中的内存泄漏? [关闭](How do you detect/avoid Memory leaks in your (Unmanaged) code? [closed])
    问题 从目前的情况来看,这个问题不适合我们的问答形式。 我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意测验或进一步的讨论。 如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 在非托管C / C ++代码中,检测内存泄漏的最佳实践是什么? 和编码指南要避免? (好像就是这么简单;) 过去,我们使用了一些愚蠢的方法:每个内存分配调用都有一个计数器递增,释放时递减。 在程序结束时,计数器值应为零。 我知道这不是一个好方法,而且有一些问题。 (例如,如果您要释放由平台API调用分配的内存,则您的分配计数将与您的释放计数不完全匹配。当然,然后,在调用分配了内存的API调用时,我们会增加计数器。) 我期待您的经验,建议,以及一些简化此工具的参考。 回答1 如果您的C / C ++代码可移植到* nix,那么没有什么比Valgrind更好的了。 回答2 如果您使用的是Visual Studio,Microsoft提供了一些有用的功能来检测和调试内存泄漏。 我将从本文开始:https://msdn.microsoft.com/zh-cn/library/x98tx3cf(v=vs.140).aspx 这是这些文章的快速摘要。 首先,包括以下标头: #define _CRTDBG_MAP_ALLOC #include
  • 旧版C / C ++项目中的死代码检测[关闭](Dead code detection in legacy C/C++ project [closed])
    问题 关闭。 此问题不符合堆栈溢出准则。 它当前不接受答案。 想要改善这个问题吗? 更新问题,使它成为Stack Overflow的主题。 4年前关闭。 改善这个问题 您将如何进行C / C ++代码中的无效代码检测? 我有一个相当大的代码库可以使用,并且至少有10-15%是无效代码。 是否有任何基于Unix的工具来识别此区域? 某些代码仍然使用大量预处理器,自动化过程可以处理吗? 回答1 您可以为此使用代码覆盖率分析工具,并在代码中查找未使用的点。 gcc工具链中流行的工具是gcov,以及图形化前端lcov(http://ltp.sourceforge.net/coverage/lcov.php)。 如果使用gcc,则可以使用gcov支持进行编译,该支持由'--coverage'标志启用。 接下来,使用此启用了gcov的版本运行您的应用程序或运行测试套件。 基本上,gcc在编译期间会发出一些额外的文件,而应用程序在运行时也会发出一些覆盖率数据。 您必须收集所有这些文件(.gcdo和.gcda文件)。 我在这里不做详细介绍,但是您可能需要设置两个环境变量来以理智的方式收集覆盖率数据:GCOV_PREFIX和GCOV_PREFIX_STRIP ... 运行之后,您可以将所有coverage数据放在一起,并通过lcov工具套件运行它。
  • idea 这么还原debug_IntelliJ IDEA 2020 的Debug功能也太好用了,真香!
    写在前边 作为一个有点强迫症的程序员来说,所有的应用软件、开发工具都必须要升级到最高版本,否则就会很难受到坐立不安、日思夜想、茶饭不思。至于什么时候得的这种病我也记不清了,哈哈哈 IntelliJ IDEA 作为工作最常用的开发工具之一,自然就成了我的主要升级对象,早上在逛IntelliJ IDEA 官网时,惊奇的发现居然有新版本更新,这让我有点喜出望外,没说的果断下载! IntelliJ IDEA 2020.1 这个版本除了修复日常bug,对调试器和事件探查器(Profiler)进行了改进,并引入了新的提交工具窗口(Commit toolwindow)以及禅模式(Zen Mode)。 debug升级 IntelliJ IDEA 2020.1 向调试器添加了数据流分析协助功能(dataflow analysis assistance),此功能根据程序执行的当前状态预测并显示可能的异常以及始终为真/假的条件。 我们说的在明白一点就是当我们调试 Java 代码并到达断点时,IDE 将基于程序的当前状态运行数据流分析,并向我们显示在代码执行到该断点之前下一步将发生的情况: 在这里插入图片描述 举个简单的例子: void test(){ 1 ; 2 ; 之前 debug 代码时只有当断点走到 int c = a + b;时才会显示 c=3 的结果。 升级后的 debug 功能可以在断点走到
  • 没有功能指针的状态机(State Machine with no function pointer)
    问题 我为安全SIL 4系统实现了具有许多状态转换的复杂状态机。 此实现的背面是使用函数指针完成的。 当一切顺利进行时,V&V反对在SIL 4系统中使用功能指针。 参考规则9 NASA.Misra C 2004但是没有说不能使用函数指针。 有没有其他方法可以实现没有任何函数指针的复杂状态机? 回答1 首先,那NASA文件不是佳能。 首先询问要求您遵循NASA文件的法律/指令/标准/要求/文件。 如果没有在任何地方强制执行(即使在美国国家航空航天局本身,这似乎也是很有可能的),那么您就没有义务遵循它,并且可以将整个过程都忽略掉。 不能把废话当作废话,可以用安全标准撞墙时使用常规程序:解决方案始终是详细记录规定的规则没有道理的方法,然后用自己的方法将它们拍打在脸上。 。 因此,不要放弃函数指针,而是要通过以下所述的方法以安全的方式使用它们。 由于所有与安全相关的设计都归结为风险评估,因此您将始终拥有: 错误->原因->危险->安全措施 根据NASA文件中给出的(较差的)基本原理,您可以使用以下内容来证明安全措施“避免函数指针”的合理性: 执行的代码错误->损坏的函数指针->失控代码/非法操作代码堆栈溢出->函数指针递归->内存损坏困惑的程序员->函数指针语法->程序意外功能 那是相当模糊和可疑的风险评估,但这就是美国宇航局文件的精髓所在。
  • 如何在R函数中检测自由变量名(How to detect free variable names in R functions [duplicate])
    问题 这个问题已经在这里有了答案: 确保函数不使用全局变量[重复] (1个答案) 6年前关闭。 假设我有一个函数: f <- function() { x + 1 } x是一个自由变量,因为它的值未在函数f定义。 有没有办法从定义的函数f获取变量名x ? 我问这个问题,同时又保留了其他人的旧R代码。 有很多可用的自由变量,这使调试变得很困难。 任何建议也欢迎。 回答1 codetools软件包具有用于此目的的功能,例如findGlobals findGlobals(f, merge=FALSE)[['variables']] # [1] "x" 如果我们将函数重新定义为具有命名参数x则不返回任何变量。 f2 <- function(x){ x+1 } findGlobals(f2, merge=FALSE)[['variables']] # character(0) 回答2 这是一个很刺耳的事情。 find_vars <- function(f, vars=list(found=character(), defined=names(formals(f)))) { if( is.function(f) ) { # function, begin search on body return(find_vars(body(f), vars)) } else if (is.call(f)
  • toLua Framework之性能检测与优化
    前言 toLua Framework是一款开源的Unity+toLua热更新框架,越来越多的游戏项目将其应用于热更新开发,但这样会形成了Lua+Mono双GC系统,而有的开发人员优化时往往只针对Mono层的优化而忽略Lua层的性能问题,或者没有类似于Unity Profiler这样高效直观的优化工具,又或者认为Lua拥有类似于C#的垃圾自动回收机制而不必优化。其实,Lua使用不规范也会造成灾难性的性能问题。 例图:Unity Profiler只能追踪到C#层与Lua层的交互代码块,而无法具体分析Lua层 性能问题 Lua层大量内存分配会导致频繁的LuaGC从而造成卡顿,这一点跟C#一样。C#和Lua频繁地互相调用存在性能损耗。Lua对象如果是全局变量会直接放在_G中,LuaGC无法清除。Lua对象被一些全局的Table引用,LuaGC无法清除。C#和Lua的互相引用,使用完未处理导致引用依然存在然后都GC不掉的情况,如Lua对象的function字段被赋值给了C#的事件/委托。Lua层配置表内存占用过大。 参考资料:https://www.jianshu.com/p/19f03570a117https://blog.uwa4d.com/archives/USparkle_Lua1.htmlhttps://blog.uwa4d.com/archives/2037.html 检测工具
  • 在Visual Studio中删除未使用的代码(Removing unused code in Visual Studio [duplicate])
    问题 这个问题已经在这里有了答案: 从Visual Studio项目中的项目中删除所有未使用的引用(14个答案) 去年关闭。 关于这个问题:“删除未使用的引用(!=“正在使用”)”,我想知道是否存在从Visual Studio解决方案中删除未使用的类,结构,委托等的工具。 设想: 我有一个由1000个组成的无组织的Visual Studio解决方案: 本机方法导入结构体代表们枚举 除了通过单击“查找所有引用”并确定是否在某处使用代码来浏览每个文件之外,还有什么机制可以使我轻松地轻松删除冗余代码文件? 例子: //This class contains a method called getRandomValue which returns type RANDOM public class NativeMethods { [DllImport("random.dll")] public static extern RANDOM getRandomValue(); } //This is the RANDOM object as referenced by getRandomValue(); [StructLayout(LayoutKind.Sequential)] public struct RANDOM { uint a; uint b; uint c; } //This is
  • 如何处理或避免C ++中的堆栈溢出(How to handle or avoid a stack overflow in C++)
    问题 在C ++中,堆栈溢出通常会导致程序无法恢复的崩溃。 对于需要真正强大的程序,这是不可接受的行为,特别是因为堆栈大小有限。 有关如何处理该问题的几个问题。 有没有一种方法可以通过常规技术来防止堆栈溢出。 (一种可扩展的,健壮的解决方案,包括处理占用大量堆栈的外部库等) 有没有一种方法可以解决堆栈溢出的情况? 最好在没有处理程序处理此类问题之前解开堆栈。 有一些语言,它们的线程带有可扩展的堆栈。 在C ++中有可能发生这种情况吗? 有关C ++行为解决方案的任何其他有用评论,将不胜感激。 回答1 处理堆栈溢出不是正确的解决方案,相反,您必须确保程序不会溢出堆栈。 不要在堆栈上分配大变量(“大”取决于程序)。 确保任何递归算法在已知最大深度后终止。 如果递归算法可能递归未知次数或大量次数,则可以自己管理递归(通过维护自己动态分配的堆栈),也可以将递归算法转换为等效的迭代算法 必须“真正强大”的程序将不会使用“占用大量堆栈”的第三方或外部库。 请注意,某些平台会在发生堆栈溢出时通知程序,并允许程序处理错误。 例如,在Windows上,将引发异常。 但是,此异常不是C ++异常,而是异步异常。 C ++异常只能由throw语句throw ,而异步异常则可以在程序执行期间的任何时间引发。 但是,这是预料之中的,因为堆栈随时可能发生溢出:任何函数调用或堆栈分配都可能会使堆栈溢出。
  • 用C#代码检测递归调用(Detect Recursive calls in C# code)
    问题 我想在我的代码中找到所有递归调用。 如果我在Visual Studio中打开文件,则会在编辑器左侧看到“递归调用”图标。 我想检查这种呼叫的整个解决方案。 我使用了Resharper命令行工具和VS的外接程序Resharper-代码检查,但是没有运气,该规则未应用在他们的规则集中。 有什么办法可以检查整个解决方案-我真的不想打开每个文件并检查那个蓝色的“递归调用”图标:) 编辑:我对单级递归感兴趣 回答1 您可以使用Mono.Cecil完成此操作。 这是一个简单的LINQPad程序,它演示: const string AssemblyFilePath = @"path\to\assembly.dll"; void Main() { var assembly = ModuleDefinition.ReadModule(AssemblyFilePath); var calls = (from type in assembly.Types from caller in type.Methods where caller != null && caller.Body != null from instruction in caller.Body.Instructions where instruction.OpCode == OpCodes.Call let callee =
  • 用于向源文件添加许可证标头的工具? [关闭](Tool for adding license headers to source files? [closed])
    问题 关闭。 此问题不符合堆栈溢出准则。 它当前不接受答案。 想要改善这个问题吗? 更新问题,使它成为Stack Overflow的主题。 6年前关闭。 改善这个问题 我正在寻找一种工具,该工具将向大量源文件添加许可证标头,其中某些源文件已经具有标头。 如果没有标题,有没有可以插入标题的工具? 编辑:我故意不标记此问题的答案,因为答案基本上都是针对特定环境且主观的 回答1 #!/bin/bash for i in *.cc # or whatever other pattern... do if ! grep -q Copyright $i then cat copyright.txt $i >$i.new && mv $i.new $i fi done 回答2 查看版权标题RubyGem。 它支持扩展名以php,c,h,cpp,hpp,hh,rb,css,js,html结尾的文件。 它还可以添加和删除标题。 通过键入“ sudo gem install copyright-header ”进行sudo gem install copyright-header 之后,可以执行以下操作: copyright-header --license GPL3 \ --add-path lib/ \ --copyright-holder 'Dude1 <dude1@host.com>' \ -
  • 在 C#、C++ 和 Java 中导致堆栈溢出的最简单方法 [关闭](Simplest ways to cause stack overflow in C#, C++ and Java [closed])
    问题 就目前而言,这个问题不适合我们的问答形式。 我们希望答案得到事实、参考或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。 如果您认为此问题可以改进并可能重新打开,请访问帮助中心以获取指导。 8 年前关闭。 我正在看 C# 教程并遇到了 StackOverflowException。 叙述者使用下面的代码片段给出了这样一个例外的巧妙例子, public class Employee { private string _name; public string Name { get{ return Name; } } } 我正在寻找 C++ 和 Java 中此类简单代码的一些示例,尤其是在 javascript 中可能导致堆栈溢出的示例。 回答1 在 Java 中: public class Test { public static void main(String[] args) { main(args); } } 一般来说,任何不终止或迭代次数过多的递归函数都会导致这个问题。 回答2 此说明是 Java、C 和 C++ 的 StackOverflowException 背后的基本原因。 任何语言都会因为递归方法调用而导致堆栈溢出异常。 假设您有一个方法调用自身或任何其他无限递归循环的方法; 它会导致 Stackoverflow 异常。
  • 手动编码解析器(hand coding a parser)
    问题 对于所有编译器专家,我想编写一个递归下降解析器,并且只想用代码来完成。 不会从其他语法中生成词法分析器和解析器,也不要告诉我阅读这本龙书,最终我会解决这个问题。 我想深入了解有关为合理的简单语言实现词法分析器和解析器的详细信息,例如CSS。 我想做正确的事。 这可能最终会带来一系列问题,但现在我从词法分析器开始。 CSS的标记化规则可以在这里找到。 我发现我的自写代码是这样的(希望您可以从此代码段中推断出其余的代码): public CssToken ReadNext() { int val; while ((val = _reader.Read()) != -1) { var c = (char)val; switch (_stack.Top) { case ParserState.Init: if (c == ' ') { continue; // ignore } else if (c == '.') { _stack.Transition(ParserState.SubIdent, ParserState.Init); } break; case ParserState.SubIdent: if (c == '-') { _token.Append(c); } _stack.Transition(ParserState.SubNMBegin); break
  • 如何验证正则表达式?(How can I validate regex?)
    问题 我想在PHP中测试正则表达式的有效性,最好在使用前进行测试。 这样做的唯一方法是实际尝试preg_match()并查看其是否返回FALSE吗? 有没有更简单/正确的方法来测试有效的正则表达式? 回答1 // This is valid, both opening ( and closing ) var_dump(preg_match('~Valid(Regular)Expression~', null) === false); // This is invalid, no opening ( for the closing ) var_dump(preg_match('~InvalidRegular)Expression~', null) === false); 正如用户pozs所说,还应考虑在测试环境@preg_match() @放在preg_match() ( @ preg_match())前面,以防止发出警告或通知。 要验证RegExp,只需对null运行它(无需知道您想先进行测试的数据) 。 如果返回显式false( === false ),则表示它已损坏。 否则它是有效的,尽管它不需要匹配任何内容。 因此,无需编写您自己的RegExp验证器。 浪费时间了... 回答2 我创建了一个简单的函数,可以调用它检查预浸料 function is_preg_error() {
  • 堆栈大小估计(Stack Size Estimation)
    问题 在多线程嵌入式软件(用C或C ++编写)中,必须为线程提供足够的堆栈空间,以使其能够完成其操作而不会溢出。 在某些实时嵌入式环境中,正确调整堆栈大小非常关键,因为(至少在我使用过的某些系统中),操作系统将无法为您检测到这一点。 通常,新线程(主线程除外)的堆栈大小是在创建线程时指定的(即在pthread_create()的参数等中)。 通常,这些堆栈大小被硬编码为在最初编写或测试代码时已知良好的值。 但是,将来对代码的更改通常会打破硬编码堆栈大小所基于的假设,并且有朝一日,您的线程进入其调用图的更深层分支之一并溢出堆栈-导致整个系统崩溃或默默地破坏内存。 在线程中执行的代码在堆栈上声明struct实例的情况下,我亲自看到了此问题。 当扩充该结构以容纳其他数据时,堆栈大小会相应膨胀,从而有可能导致堆栈溢出。 我想这对于已经建立的代码库来说可能是一个巨大的问题,因为无法立即知道向结构中添加字段的全部效果(太多的线程/函数无法找到使用该结构的所有位置)。 由于通常对“堆栈大小调整”问题的回答是“它们不是可移植的”,因此我们假定编译器,操作系统和处理器都是本次调查的已知数量。 我们还假设未使用递归,因此我们不处理“无限递归”方案的可能性。 有什么可靠的方法可以估算线程所需的堆栈大小? 我更喜欢离线(静态分析)和自动的方法,但是欢迎所有想法。 回答1 运行时评估
  • 找出Chrome控制台是否打开(Find out whether Chrome console is open)
    问题 我正在使用这个小脚本来查找Firebug是否打开: if (window.console && window.console.firebug) { //is open }; 而且效果很好。 现在,我正在搜索半小时,以找到一种方法来检测Google Chrome的内置Web开发人员控制台是否已打开,但找不到任何提示。 这个: if (window.console && window.console.chrome) { //is open }; 不起作用。 编辑: 因此,似乎无法检测到Chrome控制台是否处于打开状态。 但是有一个“ hack”有效,但有一些缺点: 控制台断开连接后将无法工作在页面加载中打开控制台时将不起作用 因此,我现在选择Unsigned的答案,但是如果some1提出了一个绝妙的主意,欢迎他继续回答,我将更改选择的答案! 谢谢! 回答1 requestAnimationFrame(2019年末) 这些先前的答案留在这里作为历史背景。 目前,穆罕默德·乌默尔(Muhammad Umer)的方法可在Chrome 78上运行,并具有检测关闭事件和打开事件的附加优点。 函数toString(2019) 感谢Overcl9ck对这个答案的评论。 用空函数对象替换正则表达式/./仍然有效。 var devtools = function() {}; devtools
  • 函数式编程的缺陷/缺点(Pitfalls/Disadvantages of Functional Programming [closed])
    问题 关门了。 这个问题是基于意见的。 它当前不接受答案。 想要改善这个问题吗? 更新问题,以便可以通过编辑此帖子以事实和引用的形式回答。 7年前关闭。 改善这个问题 您什么时候不想使用函数式编程? 那不是很擅长什么? 我更多地是在寻找整个范例的缺点,而不是诸如“未广泛使用”或“没有好的调试器”之类的东西。 到目前为止,这些答案可能是正确的,但它们将FP视为一个新概念(不可避免的问题),而不是任何固有的品质。 有关的: 函数式编程的优点为什么函数式编程还没有被接管? 回答1 对于我来说,很难想到函数式编程的许多缺点。 再说一次,我是国际函数编程会议的前任主席,因此您可以放心地认为我有偏见。 我认为主要的缺点与隔离和进入壁垒有关。 学习编写好的功能程序意味着学习以不同的方式思考,要想做到这一点,需要投入大量的时间和精力。 没有老师,很难学习。 这些属性导致一些缺点: 新手编写的功能程序可能会不必要地变慢,比新手编写的C程序更可能会慢一些。另一方面,新手编写的C ++程序也同样可能会不必要地变慢。 (所有这些闪亮的功能...) 通常,专家编写快速的功能程序并不困难。 实际上,现在8核和16核处理器上性能最好的并行程序都是用Haskell编写的。 比起像Python或Visual Basic这样的人,开始执行函数式编程的人更有可能在实现预期的生产率增长之前就放弃了。