[Homeros] Fwd: Ошибки в Voiceman

Дмитрий Падучих dpaduchikh на gmail.com
Ср Сен 21 11:20:39 UTC 2011


Michael Pozhidaev:

MP> если сильно увлекаться знаковыми типами, компилятор тебя засыпет
MP> предупреждениями типа signed/unsigned comparison. Вот на это я
MP> действительно наступал. Избежать этого невозможно, поскольку в
MP> стандартной библиотеке везде наставлены беззнаковые значения.
MP> Размеры строк, списков, индексы символов в строке - всё беззнаковое.
MP> Даже тривиальный strlen(), и тот желает отдавать результат строго
MP> без знака.

Насчёт strlen.

for (int i=0, len=strlen(s); i < len; i++)
  putchar(s[i]);

Компилируется без предупреждений и работает без ошибок для всех s, длина
которых не превосходит INT_MAX. Впрочем, в этом примере особой разницы
нет - со знаком или без. И я, в общем-то, ничего против беззнаковых
типов не имею, когда они реально удобнее.

Насчёт грабель. Я имел в виду вот эти:

voiceman$ git show e98a99555c9228f9aa24d102e2039a0a18a9c755
commit e98a99555c9228f9aa24d102e2039a0a18a9c755
Author: Michael Pozhidaev <msp на altlinux.ru>
Date:   Thu May 13 16:02:54 2010 +0700

    Fixed segmentation fauld in double numbers parsing

diff --git a/daemon/main/configuration.h b/daemon/main/configuration.h
index 7e09f52..feac9f2 100644
--- a/daemon/main/configuration.h
+++ b/daemon/main/configuration.h
@@ -2,8 +2,6 @@
 #ifndef __VOICEMAN_CONFIGURATION_H__
 #define __VOICEMAN_CONFIGURATION_H__
 
-//FIXME:*.0 in double values causes sigseg
-
 #include"CmdArgsParser.h"
 #include"ConfigurationException.h"
 #include"langs/LangManager.h"
diff --git a/utils/vmstrings.h b/utils/vmstrings.h
index 51ca50c..a6bf876 100644
--- a/utils/vmstrings.h
+++ b/utils/vmstrings.h
@@ -300,9 +300,11 @@ double parseAsDouble(const T& s)
     }
   if (!s2.empty())
     {
-      typename T::size_type z = s2.length() - 1;
-      while(z >= 0 && s2[z] == '0') z--;
-      if (z >= 0)
+      typename T::size_type z = 0;
+      for(i = 0;i < s2.length();i++)
+	if (s2[i] != '0')
+	  z = i;
+      if (s2[z] != '0')
 	{
 	  for(i = 0;i <= z;i++)
 	    {
voiceman$ 

-- 
Дмитрий Падучих


Подробная информация о списке рассылки Homeros