Subject: [ecpg bug]: can not use single '*' in multi-line comment after c preprocessor directives

From: "Winter Loo" <[email-masked]>
Date: Wed, 25 Sep 2024 15:36:48 +0800 (CST)

Hi hackers,

The following code fails to pass the ecpg compilation, although it is accepted by the gcc compiler.

```
#if ABC /* this is a multi-line
              * comment including single star character */
int a = 1;
#endif
```

The issue arises from the first '*' in the second line. Upon its removal, the ecpg compiler functions properly.

```
#if ABC /* this is a multi-line
                comment without single star character */
int a = 1;
#endif
```

The problem has been identified as a bug in the `cppline` definition within the `pgc.l` file.

```
cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+\/)|.|\\{space}*{newline})*{newline}
```
[Source](https://git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/interfaces/ecpg/preproc/pgc.l;h=f3c03482aec61956691f30426f61510920c5c702;hb=HEAD#l461)

More specifically, the bug originates from the regex pattern for the C block code comment.

```
\/\*[^*/]*\*+\/
```

Attempting another example:

```
#if ABC /* hello * world */
int a = 1;
#endif
```

This time, the ecpg compiler also functions correctly.

Confused! I am uncertain how to rectify the regex. I hope someone can address this bug.

---

From: Tom Lane <[email-masked]>
Date: Thu, 26 Sep 2024 15:04:58 -0400

> The following code fails to pass the ecpg compilation, although it is accepted by the gcc compiler.

Yeah ... an isolated "/" inside the comment doesn't work either.

> Confused! I am uncertain how to rectify the regex. I hope someone can address this bug.

I poked at this for awhile and concluded that we probably cannot make
it work with a single regexp for "cppline".  The right thing would
involve an exclusive start condition for parsing a cppline, more or
less like the way that /* comments are parsed in the <xc> start
condition.  This is kind of a lot of work compared to the value :-(.
Maybe somebody else would like to take a crack at it, but I can't
get excited enough about it.

There are other deficiencies too in ecpg's handling of these things,
like the fact that (I think) comments are mishandled in #include
directives.

			regards, tom lane