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

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

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

相关文章
|
弹性计算 安全 API
阿里云实名认证接口怎么使用的
1.阿里云实名认证接口怎么使用的,1、登录阿里云控制台 2、单击您的会员名(在页面右上角),进入账号管理页面 3、在左侧导航栏中,单击 实名认证 4、在 实名认证 页面,选择认证类型为 个人,再单击 确定 5、单击 个人支付宝认证 栏中 立即认证 按钮。
阿里云实名认证接口怎么使用的
|
Python Windows
Python3+PyCharm环境的安装及配置
近期碰到有同学入门Python还不会安装并配置Python编程环境的,在这里做一期教程手把手教大家安装与配置使用(以 Python 3.9.9 以及 PyCharm 2021.3.1 为例)
684 0
Python3+PyCharm环境的安装及配置
|
6月前
|
存储 网络协议 Linux
NFS(Network File System 网络文件服务)
NFS(Network File System 网络文件服务)
|
6月前
|
存储 缓存 NoSQL
由菜鸟到大神,谈谈redis的概念、实战、原理、高级使用方法
【5月更文挑战第18天】Redis是一个开源的内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构,如字符串、哈希、列表、集合、有序集合等。
110 10
|
6月前
|
存储 自然语言处理 NoSQL
知识图谱数据处理流程是什么
知识图谱是一种以实体、关系及其属性为基本单位,通过知识表示、存储和推理,对现实世界中的各种实体、属性进行关系抽取、语义匹配和知识推理的技术。知识图谱的数据处理流程主要包括数据获取与预处理、图谱构建、知识推理等几个步骤。
|
6月前
|
算法 前端开发 JavaScript
降低代码圈复杂度优化技巧
降低代码圈复杂度优化技巧
122 0
|
机器学习/深度学习 数据采集 人工智能
AI在戏剧与表演艺术中的应用
AI在戏剧与表演艺术中的应用
709 0
|
机器学习/深度学习 TensorFlow API
学习 TensorFlow:构建和训练机器学习模型的利器
学习 TensorFlow:构建和训练机器学习模型的利器
|
JavaScript 前端开发
vscode 圈复杂度插件-CodeMetrics
圈复杂度(Cyclomatic Complexity)是一种代码复杂度的衡量标准。它可以用来衡量一个模块判定结构的复杂程度,数量上表现为独立现行路径条数,也可理解为覆盖所有的可能情况最少使用的测试用例数。圈复杂度大说明程序代码的判断逻辑复杂,可能质量低且难于测试和维护。程序的可能错误和高的圈复杂度有着很大关系。
616 0
|
机器学习/深度学习 算法 数据挖掘
图像嵌入(Image Embedding
机器学习中的图像嵌入(Image Embedding)是一种将图像数据转化为连续的、低维度的向量表示的方法,这些向量表示通常用于后续的机器学习任务,如分类、聚类、检索等。图像嵌入的目的是将高维度的图像数据转化为更易于处理的低维度数据,同时保留尽可能多的原始图像信息。常用的图像嵌入方法包括:
2909 3