diff --git a/src/test_pamhyr.py b/src/test_pamhyr.py
index ad1c38c08e2d2657edbc0c0ba2521207c256ab63..1ce427b32c90720656aba99b25904c86d9f2e8bb 100644
--- a/src/test_pamhyr.py
+++ b/src/test_pamhyr.py
@@ -92,8 +92,9 @@ class ToolsCMDParserTestCase(unittest.TestCase):
 
         res = parse_command_line(cmd)
 
-        for i, s in enumerate(expect):
-            self.assertEqual(res[i], s)
+        self.assertEqual(len(res), len(expect))
+        for i, s in enumerate(res):
+            self.assertEqual(expect[i], s)
 
     def test_unix_simple(self):
         cmd = "/foo/bar a -b -c"
@@ -101,8 +102,9 @@ class ToolsCMDParserTestCase(unittest.TestCase):
 
         res = parse_command_line(cmd)
 
-        for i, s in enumerate(expect):
-            self.assertEqual(res[i], s)
+        self.assertEqual(len(res), len(expect))
+        for i, s in enumerate(res):
+            self.assertEqual(expect[i], s)
 
     def test_unix_quoted(self):
         cmd = "\"/foo/bar\" -a -b -c"
@@ -110,8 +112,9 @@ class ToolsCMDParserTestCase(unittest.TestCase):
 
         res = parse_command_line(cmd)
 
-        for i, s in enumerate(expect):
-            self.assertEqual(res[i], s)
+        self.assertEqual(len(res), len(expect))
+        for i, s in enumerate(res):
+            self.assertEqual(expect[i], s)
 
     def test_unix_quoted_with_space(self):
         cmd = "\"/foo/bar baz\" -a -b -c"
@@ -119,8 +122,9 @@ class ToolsCMDParserTestCase(unittest.TestCase):
 
         res = parse_command_line(cmd)
 
-        for i, s in enumerate(expect):
-            self.assertEqual(res[i], s)
+        self.assertEqual(len(res), len(expect))
+        for i, s in enumerate(res):
+            self.assertEqual(expect[i], s)
 
     def test_unix_quoted_args(self):
         cmd = "/foo/bar -a -b -c=\"baz\""
@@ -128,8 +132,9 @@ class ToolsCMDParserTestCase(unittest.TestCase):
 
         res = parse_command_line(cmd)
 
-        for i, s in enumerate(expect):
-            self.assertEqual(res[i], s)
+        self.assertEqual(len(res), len(expect))
+        for i, s in enumerate(res):
+            self.assertEqual(expect[i], s)
 
     def test_unix_quoted_args_with_space(self):
         cmd = "/foo/bar -a -b -c=\"baz bazz\""
@@ -137,8 +142,9 @@ class ToolsCMDParserTestCase(unittest.TestCase):
 
         res = parse_command_line(cmd)
 
-        for i, s in enumerate(expect):
-            self.assertEqual(res[i], s)
+        self.assertEqual(len(res), len(expect))
+        for i, s in enumerate(res):
+            self.assertEqual(expect[i], s)
 
     def test_unix_quoted2_args_with_space(self):
         cmd = "\'/foo/bar baz\' -a -b -c='baz bazz'"
@@ -146,8 +152,9 @@ class ToolsCMDParserTestCase(unittest.TestCase):
 
         res = parse_command_line(cmd)
 
-        for i, s in enumerate(expect):
-            self.assertEqual(res[i], s)
+        self.assertEqual(len(res), len(expect))
+        for i, s in enumerate(res):
+            self.assertEqual(expect[i], s)
 
     def test_unix_escape_space(self):
         cmd = r"/foo/bar\ baz -a -b -c"
@@ -155,8 +162,9 @@ class ToolsCMDParserTestCase(unittest.TestCase):
 
         res = parse_command_line(cmd)
 
-        for i, s in enumerate(expect):
-            self.assertEqual(res[i], s)
+        self.assertEqual(len(res), len(expect))
+        for i, s in enumerate(res):
+            self.assertEqual(expect[i], s)
 
     def test_windows_prog_files(self):
         cmd = "\"C:\\Program Files (x86)\foo\bar\" a -b -c"
@@ -164,8 +172,9 @@ class ToolsCMDParserTestCase(unittest.TestCase):
 
         res = parse_command_line(cmd)
 
-        for i, s in enumerate(expect):
-            self.assertEqual(res[i], s)
+        self.assertEqual(len(res), len(expect))
+        for i, s in enumerate(res):
+            self.assertEqual(expect[i], s)
 
     def test_windows_prog_files_args(self):
         cmd = "\"C:\\Program Files (x86)\foo\bar\" a -b=\"baz bazz\" -c"
@@ -176,5 +185,41 @@ class ToolsCMDParserTestCase(unittest.TestCase):
 
         res = parse_command_line(cmd)
 
-        for i, s in enumerate(expect):
-            self.assertEqual(res[i], s)
+        self.assertEqual(len(res), len(expect))
+        for i, s in enumerate(res):
+            self.assertEqual(expect[i], s)
+
+    # Parse must detect malformed command line... But is not :\
+
+    @unittest.expectedFailure
+    def test_wrong_format_0(self):
+        cmd = "'toto -a -b='baz bazz' -c"
+        expect = []
+
+        res = parse_command_line(cmd)
+
+        self.assertEqual(len(res), len(expect))
+        for i, s in enumerate(res):
+            self.assertEqual(expect[i], s)
+
+    @unittest.expectedFailure
+    def test_wrong_format_1(self):
+        cmd = "\"toto -a -b=\"baz bazz\" -c"
+        expect = []
+
+        res = parse_command_line(cmd)
+
+        self.assertEqual(len(res), len(expect))
+        for i, s in enumerate(res):
+            self.assertEqual(expect[i], s)
+
+    @unittest.expectedFailure
+    def test_wrong_format_2(self):
+        cmd = "'toto -a -b=\"baz bazz\" -c"
+        expect = []
+
+        res = parse_command_line(cmd)
+
+        self.assertEqual(len(res), len(expect))
+        for i, s in enumerate(res):
+            self.assertEqual(expect[i], s)
diff --git a/src/tools.py b/src/tools.py
index 4b60db00e8b6f71ccb04de5b18ebc46ce3551f83..3203f24d0588b2f5174518e271eef7a2f5c84fdb 100644
--- a/src/tools.py
+++ b/src/tools.py
@@ -367,12 +367,17 @@ def parse_command_line(cmd):
     words = []
     rest = cmd
 
-    while True:
-        if len(rest) == 0:
-            break
+    try:
+        while True:
+            if len(rest) == 0:
+                break
 
-        word, rest = _parse_next_word(rest)
-        words.append(word)
+            word, rest = _parse_next_word(rest)
+            words.append(word)
+    except Exception as e:
+        logger.error(f"{parse_command_line}: Failed to parse command line '{cmd}'")
+        logger.error(f"  exception raise {e}")
+        return []
 
     return words
 
@@ -442,9 +447,9 @@ def _parse_word_up_to_next_sep(words, sep=" "):
             i += len(sub_word) + 1
             word += sub_word + cur
 
-        # Get next symbol
+        # Get next token
         i += 1
-        if i == len(words):
+        if i >= len(words):
             cur = ""
         else:
             cur = words[i]