一、摘要
源自QString的arg用法导致的bug。暴露给用户的接口允许用户输入%0、%1这样的占位符,导致代码直接懵逼。
二、代码示意
QString strMsg("%1-%2");
strMsg.arg("C:/Windows/%1Dir/a.txt").arg("66");
预期的strMsg
C:/Windows/%1Dir/a.txt"-66
实际的strMsg
C:/Windows/66Dir/a.txt"-%2
三、原理分析
.arg 是链式调用,QString是运算符重载了"."
,且返回是QString &
。
第一次arg之后,strMsg=C:/Windows/%1Dir/a.txt"-%2
第二次的arg会从左开始找占位符,又找到”%1“
,然后拿”66“
替换”%1“
。
四、总结
QString的arg用法很方便,但是有雷,需谨防能输入占位符%1-99的情况。