使用sourcemonitor发现的一些问题

简介: 使用sourcemonitor发现的一些问题

使用sourcemonitor发现的一些问题

当代码中含中文注释时会影响计算结果:

(以下面代码片段为例)

情况一:

#include <iostream>
#include <vector>
using namespace std;
vector<int> arr;
int tmp = 0;
void fab(int n)
{
  if (n == 0) return 0;
  if (n <= 2) return 1;
  else return fab(n - 1) + fab(n - 2);
}
void fab1(int n)
{
  if (n == 0) return 0;
  if (n <= 2) return 1;
  else return fab(n - 1) + fab(n - 2);
}
void fab2(int n)
{
  if (n == 0) return 0;
  if (n <= 2) return 1;
  else return fab(n - 1) + fab(n - 2);
}
int binary_search(int tmp) {
  int l = 0, r = arr.size() - 1;
  while (l <= r) {
    int mid = (l + r) >> 1;
    if (arr[mid] > tmp) {
      r = mid - 1;
    } else if (arr[mid] < tmp){
      l = mid + 1;
    } else {
      return mid;
    }
  }
  return -1;
}
int main() {
  for (int i = 0; i < 10; i++) {
    arr.push_back(i);
  }
  cout << binary_search(0);
  return 0;
}

这时不包含注释,计算结果为:

当在代码中试图加入一些 中文注释和英文注释

void fab(int n)
{
  //this is fab();
  if (n == 0) return 0;
  if (n <= 2) return 1;
  else return fab(n - 1) + fab(n - 2);
}
void fab1(int n)
{
  if (n == 0) return 0;//这是中文注释
  if (n <= 2) return 1;//这是中文注释
  else return fab(n - 1) + fab(n - 2);
}
//加在这
void fab2(int n)
{
  if (n == 0) return 0;
  if (n <= 2) return 1;
  else return fab(n - 1) + fab(n - 2);
}
int binary_search(int tmp) {
  //二分搜索
  int l = 0, r = arr.size() - 1;
  //当l要r小于等于时
  while (l <= r) {
    //这里可以优化一下
    int mid = (l + r) >> 1;
    if (arr[mid] > tmp) {
      r = mid - 1;
    } else if (arr[mid] < tmp){
      l = mid + 1;
    } else {
      return mid;
    }
  }
  return -1;
}

这时计算结果为:

这里加注释后binary_search函数的复杂度发生了变化,最为严重的是竟然记录不到fab2函数了。

这是因为fab2函数的头上有一条中文注释,sourcemonitor在进行解析时,解析成了:

(sourcemonitor生成的结果中,右击对应的文件,选择View Source File可以查看源文件)

函数名跑到了注释一行,自然就找不到fab2了。

情况二:

情况二也是中文引起的,但是这个我找了好久才发现这个bug

如果将上面代码段加上一行#define HONE ("定向的")

比如:

#include <iostream>
#include <vector>
using namespace std;
#define HONE ("定向的")
vector<int> arr;
int tmp = 0;
//(...这里和上面一样)
int main() {
  for (int i = 0; i < 10; i++) {
    arr.push_back(i);
  }
  cout << binary_search(0);
  return 0;
}

计算结果为:

可以发现结果为空。

查看一下源文件:

这是因为sourcemonitor在解析"定向的"这个中文字符串时,只得到了一个" ,因此它会一直找另一个"与它匹配,但我们代码中恰好没有",所以找到文件结尾都没匹配成功,自然也就六亲不认,一个函数都没计算。

为了验证上述结论,可以在下面再写一行宏,这样就有两个"了,匹配后就能计算后面的函数了。

可以发现果真如此(虽然此时结果仍然是错的,因为代码中含中文注释):

相关文章
|
定位技术
GEE(CCDC-3)——根据CCDC segment分割后的影像进行地类变化统计和绘制土地覆被变化地图
GEE(CCDC-3)——根据CCDC segment分割后的影像进行地类变化统计和绘制土地覆被变化地图
643 0
|
6月前
|
Kubernetes Cloud Native 异构计算
133_云端扩展:Kubernetes scaling - 设置自动缩放的阈值与LLM部署最佳实践
在大语言模型(LLM)部署的时代,如何高效地管理计算资源、应对动态负载并优化成本,成为了每个AI工程师必须面对的挑战。随着LLM应用的普及,用户请求模式变得日益复杂且难以预测,传统的静态资源配置方式已无法满足需求。Kubernetes作为云原生时代的容器编排平台,其强大的自动扩展能力为LLM部署提供了理想的解决方案。
480 2
|
缓存
DevEco Studio 5.0.1 Beta3安装及配置
本文介绍了如何下载、安装和配置华为DevEco Studio 5.0.1 Beta3,并详细说明了安装HarmonyOS模拟器及创建虚拟机的步骤。包括下载安装包、卸载旧版本、选择安装目录、创建快捷方式、启动DevEco Studio、配置环境、进入设备管理器、下载虚拟机镜像、创建和启动虚拟机等操作。
2949 1
|
定位技术 芯片
闰秒(leapsecond)和原子钟(Atomic Clock)究竟是什么
文章解释了闰秒的概念和必要性,它是为保持世界标准时间(UTC)与原子时的一致而增加的一秒,以及原子钟的工作原理和最新发展,包括新型小型化原子钟的应用前景。
908 0
|
机器学习/深度学习 传感器 人工智能
Agent
【6月更文挑战第25天】
724 4
|
缓存 网络协议 Ubuntu
netperf网卡测速ubuntu linux 环境下测硬件网卡速度
netperf网卡测速ubuntu linux 环境下测硬件网卡速度
681 1
Qt 5——Qt消息机制和事件(二)
Qt 5——Qt消息机制和事件(二)
536 0
|
API C# 图形学
【推荐100个unity插件之3】切割unity3d物体插件——Ezy-Slice的使用
【推荐100个unity插件之3】切割unity3d物体插件——Ezy-Slice的使用
1158 0
|
程序员
stm32f407探索者开发板(二十一)——窗口看门狗
stm32f407探索者开发板(二十一)——窗口看门狗
833 0

热门文章

最新文章

下一篇
开通oss服务