你不会相信这个简单的技巧是如何击败破坏每个顶级 LGM 的无法解释的 bug - Codeforces

主要观点:Codeforces 存在随机导致代码变慢 100 倍并超时的慢动作 bug,疑似微软 C 运行时函数实现不佳所致,与选手代码无关。文中提供了一种缓解方法,即通过调用 Windows API 函数替代 C 库的内存分配函数来重写代码,如添加#include <windows.h>及相关newdelete函数重载,但无法确定此方法是否能解决问题。同时讨论了关于利用该 bug 进行 hack 的问题,认为这不公平,希望尽快部署补丁。作者表示未来 6 个月不再接触 Windows 或 PE 相关内容。
关键信息:

  • 存在随机 TLE 的 bug,改变代码某些部分可能导致代码变慢 100 倍。
  • 怀疑是微软 C 运行时函数实现问题,Codeforces 运行在 Windows 上使用微软 C 库。
  • 提供的缓解方法是用 Windows API 函数替代 C 库的内存分配函数。
  • 讨论了利用该 bug 进行 hack 的公平性问题。
    重要细节:
  • 示例代码展示了 bug 的表现,如一个包含vector<vector<int>>的循环代码在特定条件下变慢。
  • 调查过程中发现与 28 字节的分配相关,推测与内存分配算法有关。
  • 研究了不同 C 库(UCRT 和 MSVCRT)的源代码及相关函数实现。
  • 确认 Codeforces 的 C++20(64)使用 WinLibs 且使用 MSVCRT 的malloc
  • 提出可能的修复方案,如替换为其他内存管理库或使用 UCRT 或 GNU libc。
阅读 13
0 条评论