Pelles C forum

Pelles C => Bug reports => Topic started by: brettk on December 09, 2018, 10:31:04 pm

Title: Unexplainable compiler error?? "fatal error #1043: Input buffer overflow."
Post by: brettk on December 09, 2018, 10:31:04 pm
I keep getting this compiler error for a specific file. It seems to be complaining about the length of a define, but I have shortened it over and over and it's still complaining. It'll complain about a random line, it's always different. How do I get passed this error so I can compile my code?
Title: Re: Unexplainable compiler error?? "fatal error #1043: Input buffer overflow."
Post by: TimoVJL on December 09, 2018, 11:49:48 pm
In Pelles C max line length is below 4096 chars.

EDIT:
Quote
WG14/N1256 Committee Draft โ€” Septermber 7, 2007 ISO/IEC 9899:TC3

โ€”4095 characters in a logical source line
โ€”4095 characters in a character string literal or wide string literal (after concatenation)
Title: Re: Unexplainable compiler error?? "fatal error #1043: Input buffer overflow."
Post by: brettk on December 11, 2018, 11:17:58 pm
In Pelles C max line length is below 4096 chars.

What is the definition of a "line" then? Because that is definitely not the problem. And I have lines much longer than that.
Title: Re: Unexplainable compiler error?? "fatal error #1043: Input buffer overflow."
Post by: frankie on December 12, 2018, 09:51:23 am
Input file lines length.
Maximum PellesC input line lenght is 4095 chars.
As previously pointed out by Timo, the limits of translation, specify the length of logical lines, see ISO/IEC 9899:2017 ยง5.2.4.1 Translation limits (but also C99-C11), as follow:
Quote
The implementation shall be able to translate and execute at least one program that contains at least
one instance of every one of the following limits:
  • 127 nesting levels of blocks
  • 63 nesting levels of conditional inclusion
  • 12 pointer, array, and function declarators (in any combinations) modifying an arithmetic, structure, union, or void type in a declaration
  • 63 nesting levels of parenthesized declarators within a full declarator
  • 63 nesting levels of parenthesized expressions within a full expression
  • 63 significant initial characters in an internal identifier or a macro name(each universal character name or extended source character is considered a single character)
  • 31 significant initial characters in an external identifier (each universal character name specifying a short identifier of 0000FFFF or less is considered 6 characters, each universal character name specifying a short identifier of 00010000 or more is considered 10 characters, and each extended source character is considered the same number of characters as the corresponding universal character name, if any)
  • 4095 external identifiers in one translation unit
  • 511 identifiers with block scope declared in one block
  • 4095 macro identifiers simultaneously defined in one preprocessing translation unit
  • 127 parameters in one function definition
  • 127 arguments in one function call
  • 127 parameters in one macro definition
  • 127 arguments in one macro invocation
  • 4095 characters in a logical source line
  • 4095 characters in a string literal (after concatenation)
  • 65535 bytes in an object (in a hosted environment only)
  • 15 nesting levels for #included files
  • 1023 case labels for a switch statement (excluding those for any nested switch statements)
  • 1023 members in a single structure or union
  • 1023 enumeration constants in a single enumeration
  • 63 levels of nested structure or union definitions in a single struct-declaration-list
You should check that your source is compliant with each one of the limits above, if your code can compile with a different compiler it should be considered a custom extension of such a compiler, and then the code not portable.
Title: Re: Unexplainable compiler error?? "fatal error #1043: Input buffer overflow."
Post by: bitcoin on March 14, 2019, 12:22:26 pm
But if I need to use huge string? I tried to put it into resources or into char..  , anyway i see this error.

How i can split the string and merge into memory?

don't want to use visual studio, because it sucks.
Title: Re: Unexplainable compiler error?? "fatal error #1043: Input buffer overflow."
Post by: TimoVJL on March 14, 2019, 12:42:21 pm
A string was not a OP problem.

A huge string can combined from shorter lines.
Code: [Select]
char *huge_str =
"...."
... repeat parts
"....";
Title: Re: Unexplainable compiler error?? "fatal error #1043: Input buffer overflow."
Post by: bitcoin on March 14, 2019, 01:59:09 pm
TimoVJL try to put this, in my Pelles it's fail..
https://pastebin.com/8GL5MPuX
Title: Re: Unexplainable compiler error?? "fatal error #1043: Input buffer overflow."
Post by: DMac on March 14, 2019, 05:45:17 pm
You could break the data up into large chunks and then combine them.  As with this example.

Code: [Select]
#include <stdio.h>
#include <tchar.h>
#include <mapidefs.h>

/// @def NELEMS(a)
///
/// @brief Computes number of elements of an array.
///
/// @param a An array.
#define NELEMS(a) (sizeof(a) / sizeof((a)[0]))

// Create a circular buffer (for Join())
static LPTSTR *ppBuffer = NULL;

/// @brief Concatenates two sub strings into a new string.
///
/// @param str1 A string
/// @param str2 Another string.
///
/// @returns A pointer to a temporarily allocated string.
LPTSTR Join(LPTSTR str1, LPTSTR str2)
{
    register INT tmplen = 0;
    register LPTSTR strtmp;
    static INT StrCnt = 0;

    if(NULL == ppBuffer) // initialize buffer
    {
        ppBuffer = (LPTSTR *) calloc(2, sizeof(LPTSTR));
    }

    tmplen = _tcslen(str1) + _tcslen(str2);

    StrCnt = (StrCnt + 1) & 1;
    if (ppBuffer[StrCnt])
        free(ppBuffer[StrCnt]);

    strtmp = (ppBuffer[StrCnt] = (LPTSTR)calloc(tmplen + 1, sizeof(TCHAR)));

    _tcscat(strtmp, str1);
    _tcscat(strtmp, str2);

    return strtmp;
}

int main(int argc, char *argv[])
{
LPTSTR arrStrings[4];
        arrStrings[0] = "Big string 1 + ";
arrStrings[1] = "Big string 2 + ";
arrStrings[2] = "Big string 3 + ";
arrStrings[3] = "Big string 4";

LPTSTR heapString = "";

for(int i = 0; i < NELEMS(arrStrings); i++)
{
heapString = Join(heapString,arrStrings[i]);
}

printf("%s\n",heapString);
return _getch();
}
Title: Re: Unexplainable compiler error?? "fatal error #1043: Input buffer overflow."
Post by: Pelle on March 17, 2019, 10:18:48 pm
Hard to say much without sample code, but you can also get this error if a macro invocation contains unbalanced parenthesis for example (the compiler thinks the macro goes on, and on, and on, and...)
Title: Re: Unexplainable compiler error?? "fatal error #1043: Input buffer overflow."
Post by: TimoVJL on March 17, 2019, 10:31:40 pm
Test case for error #2076: String literal too long.
Title: Re: Unexplainable compiler error?? "fatal error #1043: Input buffer overflow."
Post by: Pelle on March 17, 2019, 10:51:00 pm
ISO sets a limit of 4095 characters in a string literal after concatenation. Pelles C will accept more, but there must still be a limit.
Anyway, the original complain was about "input buffer overflow" not "string literal too long". Getting off topic, me thinks...